sql >> Database >  >> NoSQL >> MongoDB

MongoDB lijst projectie van subveld

Ik vind de opdracht!! het is niet find() :-)

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

db.collection.distinct

(bewerken)

Oeps, het "strikt juiste" antwoord is een lijst (waar herhaling mogelijk is) geen set (waar geen herhaling optreedt). Zie het geval van db.lang_meta.distinct("resources.mediatype") , waarbij de juiste oplossing een lijst van vier herhaalde items moet retourneren, niet slechts één.

Voor lijst we kunnen map() . gebruiken ... Nou, stel dat er maar één item is, dan is het ...

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

maar moet herhalen over .resources en over .fields , dus

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

... dat is dichtbij, maar niet de ideale (elegante) oplossing.

Terugkerend naar het resources.mediatype dat is bijvoorbeeld een betere illustratie van de "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;
});

Dat levert "text/csv", "text/csv", "text/csv", "text/csv" op (!)maar in een array-of-array-structuur... geen simpele array.

Oplossing?

Laten we iets doen met db.lang_meta.find({},{"resources.schema.fields.name":1}) ...




  1. Hoe json-string naar bson-document te rangschikken om naar MongoDB te schrijven?

  2. Update meerdere documenten in een collectie met switch case

  3. MongoDB Stitch retourneert gegevens als $NumberDouble in plaats van het nummer zelf

  4. Operationele databasebeveiliging - deel 1