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