sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB listová projekce podpole

Nacházím příkaz!! není to find() :-)

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

db.collection.distinct

(upravit)

Ops, "zcela správná" odpověď je seznam (kde je možné opakování itens) není množina (kde nedochází k opakování). Viz případ db.lang_meta.distinct("resources.mediatype") , kde správné řešení musí vrátit seznam čtyř opakovaných položek, nikoli pouze jednu.

Pro seznam můžeme použít map() ... Předpokládejme, že pouze jedna položka, byla by to ...

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

ale musí iterovat přes .resources a přes .fields , takže

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

... to je blízké, ale ne ideální (elegantní) řešení.

Návrat na resources.mediatype příklad, to je lepší ilustrace k "opakování 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;
});

To vytváří "text/csv", "text/csv", "text/csv", "text/csv" (!), ale ve struktuře array-of-array... ne jednoduché pole.

Řešení?

Pojďme něco udělat s db.lang_meta.find({},{"resources.schema.fields.name":1}) ...




  1. Jak udržím has_many :through vztahy při serializaci do JSON a zpět v Rails 4.0.3?

  2. Podporuje Moongoose 3.8.8 operátora $position?

  3. Běží mongodb?

  4. aktualizace mongoose:$inc nefunguje v upsert