2011-07-02 23 views
6

Tengo una colección de documentos que contienen una matriz de documentos secundarios. Cada subdocumento tiene un valor de tiempo. Estoy tratando de ver si puedo devolver un documento secundario, en función del tiempo en el documento secundario.Consulta de MongoDB para recuperar un valor de matriz por un valor en la matriz

Sé que puedo recuperar un documento secundario usando $ slice, pero $ slice solo me da un índice o rango y desplazamiento específicos.

tiempo de ejemplo!

documentos son como así ....

{ 
    id: 1234, 
    type: 'a', 
    subs: [ 
     { time: 123001, val: 'a' }, 
     { time: 123002, val: 'b' }, 
     { time: 123003, val: 'c' } 
    ] 
} 

Si hago una consulta con find ({}, {submarinos: {$ rebanada: [2,1]}}) Me Atrás algo así como :

{ id: 1234, type: 'a', subs: [{ time: 123002, val: 'b' }]} 

Quiero recuperar ese registro, por ejemplo, basado no en el desplazamiento, sino en el valor de tiempo 123002.

¿Posible?

go!

Respuesta

4

Como ha diseñado los datos esto no es posible.

En MongoDB, las consultas devuelven un documento completo. Puede filtrar campos específicos, pero si el valor de un campo es una matriz, se detiene allí.

Cuando se tiene "matrices de objetos", que o bien tienen que $slice, que no es lo que quiere, o usted tiene que modelar sus datos de manera diferente.

En su caso, la siguiente estructura hará que su posible consulta:

{ 
    _id: 1234, 
    type: 'a', 
    subs: { 
     '123001': { val: 'a' }, 
     '123002': { val: 'b' }, 
     '123003': { val: 'c' } 
    } 
} 

Aviso cómo he cambiado subs en un objeto JSON en lugar de una matriz. Ahora se puede hacer la siguiente consulta y obtener sólo el tiempo que usted está buscando:

find({ _id: 1234 }, { 'subs.123002': 1 }) 

La obvia disyuntiva aquí es que usted tendrá que cambiar el modo de usar cambiar el documento. No puede usar $push en subs, no puede consultar {'subs.time': 1234}, en su lugar debe consultar {'subs.1234': { $exists:true} }.

+0

¡Oh, duhh! Sí, eso funcionará. Gracias. Aunque a menos que malinterprete lo que estaba diciendo, puede devolver parte de un documento .. http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields Simplemente no es parte de una matriz sin usar slice . ¡Gracias! – FredArters

+0

Si usa su estructura original, puede hacer ''subs.2'' para obtener el tercer elemento de la matriz. Pero generalmente no sabes cuál es realmente el tercer elemento. Entonces, para las matrices, generalmente es todo o nada. –

+1

La pregunta es antigua, pero tal vez esto sea útil para alguien que está buscando una respuesta. Es posible hacer coincidir un documento dentro de una matriz con $ elemMatch. http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29#DotNotation%28ReachingintoObjects%29-Matchingwith%24elemMatch – Esteban

Cuestiones relacionadas