¡¡Encuentro el comando!! no es find() :-)
db.lang_meta.distinct("resources.schema.fields.name")
(editar)
Ops, la respuesta "estrictamente correcta" es una lista (donde es posible repetir elementos) no es un conjunto (donde no se repite). Ver el caso de db.lang_meta.distinct("resources.mediatype") , donde la solución correcta debe devolver una lista de cuatro elementos repetidos, no solo uno.
Para lista podemos usar map() ... Bueno, supongamos que solo un elemento, sería ...
db.lang_meta.find().map(function(c) {
return c.resources[0].schema.fields[0].name;
});
pero debe iterar sobre .resources y sobre .fields , entonces
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;
});
... que está cerca pero no es la solución ideal (elegante).
Volviendo a resources.mediatype ejemplo, esa es una mejor ilustración para los "elementos repetidos",
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;
});
Eso produce "text/csv", "text/csv", "text/csv", "text/csv" (!) pero en una estructura de matriz de matriz... no una matriz simple.
¿Solución?
Hagamos algo con db.lang_meta.find({},{"resources.schema.fields.name":1}) ...