MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Projekcja listy MongoDB podpola

Znalazłem polecenie!! to nie jest find() :-)

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

db.collection.distinct

(edytuj)

Ups, „ściśle poprawna” odpowiedź to lista (gdzie możliwe są powtórzenia), a nie zestaw (gdzie nie występuje powtórzenie). Zobacz przypadek db.lang_meta.distinct("resources.mediatype") , gdzie poprawne rozwiązanie musi zwrócić listę czterech powtarzających się elementów, a nie tylko jednego.

Dla listy możemy użyć map() ... Cóż, załóżmy tylko jeden element, byłoby to ...

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

ale musi wykonać iterację przez .resources i ponad .fields , więc

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 bliskie, ale nie idealne (eleganckie) rozwiązanie.

Wracając do resources.mediatype na przykład, to jest lepsza ilustracja do "powtórz 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;
});

Daje to "text/csv", "text/csv", "text/csv", "text/csv" (!) Ale w strukturze array-of-array... a nie prostej tablicy.

Rozwiązanie?

Zróbmy coś z db.lang_meta.find({},{"resources.schema.fields.name":1}) ...




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak mogę określić zasobnik GridFS?

  2. Javers ENTITY_INSTANCE_WITH_NULL_ID przy korzystaniu z 2 baz danych

  3. TypeError:object nie jest funkcją w użyciu MongoDB z Node.js

  4. Przegląd MongoDB i równoważenia obciążenia

  5. C# z mongodb DateTime Convert