¡¡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})
...