sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB list proyección de subcampo

¡¡Encuentro el comando!! no es find() :-)

db.lang_meta.distinct("resources.schema.fields.name")

db.collection.distinct

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