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

MongoDB listeprojektion af underfelt

Jeg finder kommandoen!! det er ikke find() :-)

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

db.collection.distinct

(rediger)

Ops, det "strengt korrekte" svar er en liste (hvor gentagelse er mulig) ikke et sæt (hvor ingen gentagelse forekommer). Se tilfældet med db.lang_meta.distinct("resources.mediatype") , hvor den korrekte løsning skal returnere en liste med fire gentagne punkter, ikke kun én.

Til liste vi kan bruge map() ... Tja, antag kun én genstand, det ville være ...

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

men skal iterere over .resources og over .fields , så

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

... det er tæt på, men ikke den ideelle (elegante) løsning.

Vender tilbage til resources.mediatype for eksempel er det en bedre illustration til "gentag 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;
});

Det producerer "text/csv", "text/csv", "text/csv", "text/csv" (!)men i en array-of-array-struktur... ikke et simpelt array.

Løsning?

Lad os gøre noget med db.lang_meta.find({},{"resources.schema.fields.name":1}) ...




  1. Vil du gengive grundlæggende HTML-visning?

  2. Integrationer og tjenester tilgængelige fra MongoDB til skyen

  3. Dynamisk databaseforbindelse til mongodb eller mongoose fra nodejs

  4. Find en eller opret med Mongoose