MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Projeção da lista MongoDB do subcampo


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