Achei o comando!! não é
find()
:-) db.lang_meta.distinct("resources.schema.fields.name")
db.collection.distinct
(editar)
Ops, a resposta "estritamente correta" é uma lista (onde itens repetidos são possíveis) não é um conjunto (onde não ocorre repetição). Veja o caso de
db.lang_meta.distinct("resources.mediatype")
, onde a solução correta deve retornar uma lista de quatro itens repetidos, não apenas um. Para lista podemos usar
map()
... Bem, suponha que apenas um item, seria ... db.lang_meta.find().map(function(c) {
return c.resources[0].schema.fields[0].name;
});
mas deve iterar sobre
.resources
e sobre .fields
, assim 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á perto, mas não é a solução ideal (elegante).
Retornando ao
resources.mediatype
exemplo, essa é uma ilustração melhor para os "itens 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;
});
Isso produz
"text/csv", "text/csv", "text/csv", "text/csv"
(!) mas em uma estrutura array-of-array... não um array simples. Solução?
Vamos fazer algo com
db.lang_meta.find({},{"resources.schema.fields.name":1})
...