MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Listenprojektion des Unterfelds

Ich finde den Befehl!! es ist nicht find() :-)

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

db.collection.distinct

(bearbeiten)

Ups, die "absolut richtige" Antwort ist eine Liste (wo Wiederholungen möglich sind) kein Set (wo keine Wiederholung auftritt). Siehe den Fall von db.lang_meta.distinct("resources.mediatype") , wobei die richtige Lösung eine Liste mit vier wiederholten Elementen zurückgeben muss, nicht nur eine.

Für Liste wir können map() verwenden ... Nun, angenommen nur ein Element, es wäre ...

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

muss aber über .resources iterieren und über .fields , also

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

... das ist nah, aber nicht die ideale (elegante) Lösung.

Zurück zu resources.mediatype Beispiel, das ist eine bessere Veranschaulichung zu den "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;
});

Das erzeugt "text/csv", "text/csv", "text/csv", "text/csv" (!)aber in einer Array-of-Array-Struktur... kein einfaches Array.

Lösung?

Machen wir etwas mit db.lang_meta.find({},{"resources.schema.fields.name":1}) ...