MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Projection de la liste MongoDB du sous-champ

je trouve la commande !! ce n'est pas find() :-)

db.lang_meta.distinct("resources.schema.fields.name")

db.collection.distinct

(modifier)

Ops, la réponse "strictement correcte" est une liste (où la répétition d'éléments est possible) pas un ensemble (où aucune répétition ne se produit). Voir le cas de db.lang_meta.distinct("resources.mediatype") , où la solution correcte doit renvoyer une liste de quatre éléments répétés, pas un seul.

Pour liste nous pouvons utiliser map() ... Eh bien, supposons qu'un seul élément, ce serait ...

db.lang_meta.find().map(function(c) { 
  return c.resources[0].schema.fields[0].name; 
});

mais doit itérer sur .resources et sur .fields , donc

db.lang_meta.find().map(function(c) {
    var ret = [];
    for (var i=0; i<c.resources.length; i++) 
        for (var j=0; j<c.resources[i].schema.fields.length; j++) 
             ret.push( c.resources[i].schema.fields[j].name );
   return ret;
});

... c'est proche mais pas la solution idéale (élégante).

Retour au resources.mediatype exemple, c'est une meilleure illustration des "items répétés",

db.lang_meta.find().map(function(c) {
    var ret = [];
    for (var i=0; i<c.resources.length; i++) 
             ret.push( c.resources[i].mediatype );
   return ret;
});

Cela produit "text/csv", "text/csv", "text/csv", "text/csv" (!) mais dans une structure tableau de tableaux... pas un simple tableau.

Solution ?

Faisons quelque chose avec db.lang_meta.find({},{"resources.schema.fields.name":1}) ...