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?
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.
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'
}
});