Nacházím příkaz!! není to find()
:-)
db.lang_meta.distinct("resources.schema.fields.name")
(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})
...