Comment interroger des objets imbriqués?

J'ai un problème lors de l'interrogation de mongoDB avec la notation des objets imbriqués:

db.messages.find( { headers : { From: "reservations@marriott.com" } } ).count()
0
db.messages.find( { 'headers.From': "reservations@marriott.com" }  ).count()
5

Je ne vois pas ce que je fais de mal. Je m'attends à ce que la notation d'objet imbriquée renvoie le même résultat que la requête de notation par points. Où ai-je tort?

159
demandé sur Machavity 2013-04-14 22:21:50

2 réponses

db.messages.find( { headers : { From: "reservations@marriott.com" } } )

Cette requête pour les documents où headers égal { From: ... }, c'est-à-dire ne contient pas d'autres champs.


db.messages.find( { 'headers.From': "reservations@marriott.com" } )

Cela ne regarde que le champ headers.From, qui n'est pas affecté par d'autres champs contenus dans headers ou manquants dans headers.


Docs de notation par points

317
répondu shx2 2014-05-02 19:47:51

Les deux mécanismes de requête fonctionnent de différentes manières, comme suggéré dans les documents à la section sous-Documents :

Lorsque le champ contient un document incorporé (c'est-à-dire sous-document ), Vous pouvez soit spécifier l'intégralité du sous-document {[9] } comme valeur d'un champ, soit "atteindre" le sous-document en utilisant la notation par points, pour spécifier des valeurs pour des champs individuels dans le sous-document :

L'égalité correspond à l'intérieur des sous-documents le sous-document correspond exactement au sous-document spécifié, y compris l'ordre des champs.


Dans l'exemple suivant, la requête correspond à tous les documents pour lesquels la valeur du champ producteur est un sous-document, qui contient uniquement le champ company avec la valeur 'ABC123' et le champ address avec la valeur '123 Street', dans l'ordre exact:

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});
18
répondu Edmondo1984 2014-05-05 19:45:20