MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Proiezione dell'elenco MongoDB del sottocampo

trovo il comando!! non è find() :-)

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

db.collection.distinct

(modifica)

Ops, la risposta "strettamente corretta" è un elenco (dove è possibile la ripetizione) non un set (dove non si verifica alcuna ripetizione). Vedi il caso di db.lang_meta.distinct("resources.mediatype") , dove la soluzione corretta deve restituire un elenco di quattro elementi ripetuti, non solo uno.

Per elenco possiamo usare map() ... Bene, supponiamo solo un oggetto, sarebbe ...

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

ma deve scorrere su .resources e su .fields , quindi

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;
});

... che è vicino ma non è la soluzione ideale (elegante).

Tornando al resources.mediatype esempio, questa è un'illustrazione migliore per "repeat itens",

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;
});

Ciò produce "text/csv", "text/csv", "text/csv", "text/csv" (!) ma in una struttura array-of-array... non un semplice array.

Soluzione?

Facciamo qualcosa con db.lang_meta.find({},{"resources.schema.fields.name":1}) ...