Znalazłem polecenie!! to nie jest find()
:-)
db.lang_meta.distinct("resources.schema.fields.name")
(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})
...