trovo il comando!! non è find()
:-)
db.lang_meta.distinct("resources.schema.fields.name")
(modifica)
Ops, la risposta "strettamente corretta" è un elenco (dove è possibile la ripetizione) non un set (dove non si verifica alcuna ripetizione). Vedi il caso di db.lang_meta.distinct("resources.mediatype")
, dove la soluzione corretta deve restituire un elenco di quattro elementi ripetuti, non solo uno.
Per elenco possiamo usare map()
... Bene, supponiamo solo un oggetto, sarebbe ...
db.lang_meta.find().map(function(c) {
return c.resources[0].schema.fields[0].name;
});
ma deve scorrere su .resources
e su .fields
, quindi
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;
});
... che è vicino ma non è la soluzione ideale (elegante).
Tornando al resources.mediatype
esempio, questa è un'illustrazione migliore per "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;
});
Ciò produce "text/csv", "text/csv", "text/csv", "text/csv"
(!) ma in una struttura array-of-array... non un semplice array.
Soluzione?
Facciamo qualcosa con db.lang_meta.find({},{"resources.schema.fields.name":1})
...