2012-02-08 33 views
7

Dado el ejemplo de doc a continuación:mongodb campo de selección para volver documento incrustado en la matriz

{ 
    "_id" : "2", 
    "objects" : [{ 
     "_id" : "1", 
     "name" : "embedded " 
    },{ 
     "_id" : "2", 
     "name" : "embedded " 
    },{ 
     "_id" : "3", 
     "name" : "embedded " 
    }], 
    "name" : "gloss2" 
} 

¿Es posible devolver un solo subdocumento? De esta forma, no tengo que seleccionar el objeto padre completo, obtener la lista y recorrer la lista para obtener el objeto en cuestión.

{ 
    "_id" : "2", 
    "name" : "embedded" 
} 

Respuesta

14

¿Es posible devolver solo un subdocumento?

Sí, pero no de la manera que desee. Si lo hace lo siguiente, solo se pondrá en contacto el primer elemento de la matriz:

coll.find({_id:'2'}, { 'objects.0': 1}) 

Sin embargo, lo que realmente quiere es algo que se parece a lo siguiente:

coll.find({_id:'2', 'objects._id': '3'}, { 'objects.$' : 1}) 

Por supuesto, eso en realidad no funciona en MongoDB.

En cuanto a your other question, esta es una de las razones para utilizar el "objeto incrustado" en lugar de la "matriz de objetos". Con "objeto incrustado" puede hacer lo siguiente:

coll.find({_id:'2'}, {'objects.3': 1}) // where 3 is the id of the third object 

Esto le permite elegir solo los "objetos incrustados" que necesita.

De esa manera no tengo que seleccionar todo el objeto padre ...

La cosa con MongoDB es que el documento de nivel superior es siempre descabellada. Las consultas devuelven documentos de nivel superior. Esto está cocido en toda la arquitectura. Incluso si solicita solo una porción del documento, el servidor todavía tiene que cargar todo el documento en la memoria antes de servirle la pieza solicitada.

La única forma de evitar esto puede ser la nueva Aggregation Framework, pero aún no está en la rama estable.

+0

Genial, gracias por la explicación. –

2

Puede devolver un subdocumento, pero no puede devolver un elemento de un conjunto. Lo siento.

0

Mongodb 3.2 presenta $ elemMatch con el que puede obtener solo un primer documento coincidente de la matriz de documentos.

db.sample.find({_id:"2"},{objects:{$elemMatch:{_id:"2"}}}) 
Cuestiones relacionadas