2011-04-20 18 views
12
> db.test.insert({"a" : { "b" : { "c" : { "d1" : [ "e1" ], 
              "d2" : [ "e2" ], 
              "d3" : [ "e3", "e4" ], 
              "d4" : [ "e5", "e6" ] } } } }) 
> db.test.find({'a.b.c' : {$exists : true}}) 
{ "_id" : ObjectId("4daf2ccd697ebaacb10976ec"), "a" : { "b" : { "c" : { "d1" : [ "e1" ], "d2" : [ "e2" ], "d3" : [ "e3", "e4" ], "d4" : [ "e5", "e6" ] } } } } 

Pero ninguno de estos funciona:

> db.test.find({'a.b': "c"}) 
> db.test.find({'a.b': {$elemMatch : {"c" : {$exists: true}}}}) 
> db.test.find({'a.b': {$elemMatch : {$elemMatch : {$all : ["e1"] }}}}) 

Supongamos que yo no sé lo que los valores de c y d1 ... d4 son. ¿Existe una forma genérica de buscar la estructura de los objetos anidados para valores particulares?

Pensé que era para lo que era $elemMatch.

Gracias.

+0

Verificar $ elemMatch [documentation] (http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24elemMatch). –

Respuesta

6

pensé que era lo que estaba por $ elemMatch ...

De the docs: Usando el operador de consulta $ elemMatch, puede hacer coincidir un documento completo dentro de un arreglo.

Esto no suena como lo que estás buscando.

¿Hay una manera genérica de buscar la estructura de los objetos anidados para valores particulares?

Parece que usted quiere buscar "todo en el objeto 'c' para una instancia de 'e1'".

MongoDB es compatible con dos funciones relacionadas, pero las funciones no son exactamente lo que estás buscando.

  • alcance en objetos, notación de puntos: db.test.find({'a.b.c.d1' : 'e1'})
  • Leer a través de matrices: `db.test.find ({ 'abcd4': 'e5'})

Se Parece que estás buscando la habilidad de hacer ambas cosas al mismo tiempo. Desea "alcanzar objetos" y "leer arreglos" en la misma consulta.

Lamentablemente, no conozco esta característica. Puede querer file a feature request para esto.

+1

Gracias, lo hice [solicite la función] (https://jira.mongodb.org/browse/SERVER-2989). – trope

+1

Su enlace a documentos requiere un inicio de sesión. – Ixx

2

Trope, ¿alguna vez encontró la respuesta a su pregunta?

creo que la consulta que estás buscando es

db.test.find({ 'a.b.c': { '$exists': true } }); 

Para su crédito, que estuvo cerca!

De todos modos, ¡espero que esto ayude!

+0

sí, esta consulta funciona, pero estoy buscando una forma de buscar por la clave o el valor del objeto anidado cuando no se sabe cuál es la clave intermedia ('b' en este caso). – trope

+1

I [presenté una solicitud de función] (https://jira.mongodb.org/browse/SERVER-2989), así que espero que esté disponible pronto. – trope

Cuestiones relacionadas