sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB listprojektion av underfält

Jag hittar kommandot!! det är inte find() :-)

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

db.collection.distinct

(redigera)

Ops, det "strikt korrekta" svaret är en lista (där det är möjligt att upprepa itens) inte en uppsättning (där ingen upprepning sker). Se fallet med db.lang_meta.distinct("resources.mediatype") , där den korrekta lösningen måste returnera en lista med fyra upprepade poster, inte bara en.

För lista vi kan använda map() ... Tja, anta bara ett föremål, det skulle vara ...

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

men måste iterera över .resources och över .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 är nära men inte den ideala (eleganta) lösningen.

Återgår till resources.mediatype till exempel, det är en bättre illustration till "upprepa 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 ger "text/csv", "text/csv", "text/csv", "text/csv" (!)men i en array-of-array-struktur... inte en enkel array.

Lösning?

Låt oss göra något med db.lang_meta.find({},{"resources.schema.fields.name":1}) ...




  1. Inte lika i mongo mapper

  2. MongoDB geospatial fråga med $not

  3. Returnera dokument i varje grupp med maxvärde med MongoDB

  4. Sellerifel:result.get timeout