Cómo consultar objetos anidados?


Tengo un problema al consultar MongoDB con la notación de objetos anidados:

db.messages.find( { headers : { From: "[email protected]" } } ).count()
0
db.messages.find( { 'headers.From': "[email protected]" }  ).count()
5

No puedo ver lo que estoy haciendo mal. Espero que la notación de objetos anidados devuelva el mismo resultado que la consulta de notación de puntos. ¿Dónde me equivoco?

Author: Machavity, 2013-04-14

2 answers

db.messages.find( { headers : { From: "[email protected]" } } )

Esto consulta documentos donde headers igual { From: ... }, es decir, no contiene otros campos.


db.messages.find( { 'headers.From': "[email protected]" } )

Esto solo mira el campo headers.From, no afectado por otros campos contenidos en, o faltantes de, headers.


Dot-notation docs

 317
Author: shx2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-02 19:47:51

Los dos mecanismos de consulta funcionan de diferentes maneras, como se sugiere en los documentos en la sección Subdocumentos :

Cuando el campo contiene un documento incrustado (es decir, subdocument), puede especificar todo el subdocument como el valor de un campo, o" llegar a " el subdocument utilizando la notación de puntos, para especificar valores para campos individuales en el subdocument:

Igualaciones dentro de subdocumentos seleccione documentos si el subdocumento coincide exactamente con el especificado subdocumento, incluyendo el orden de los campos.


En el siguiente ejemplo, la consulta coincide con todos los documentos donde el valor del campo productor es un subdocumento que contiene solo el campo company con el valor 'ABC123' y el campo address con el valor '123 Street', en el orden exacto:

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});
 18
Author: Edmondo1984,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-05 19:45:20