267 votes

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 par objets imbriqués renvoie le même résultat que la requête en notation par points. Où est-ce que je me trompe ?

528voto

shx2 Points 14025

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

Cette recherche porte sur les documents où headers est égal à { From: ... } c'est-à-dire qu'il ne contient aucun autre champ.


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

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


Docs sur la notation par points

26voto

Edmondo1984 Points 5059

Les deux mécanismes d'interrogation fonctionnent de manière différente, comme le suggère le document les docs à la section Sous-documents :

Lorsque le champ contient un document incorporé (c'est-à-dire sous-document ), vous pouvez soit spécifier l'intégralité de la sous-document en tant que valeur d'un champ, ou "atteindre" le champ sous-document en utilisant la notation par points, afin de spécifier les valeurs des champs individuels dans le fichier sous-document :

Les correspondances d'égalité dans les sous-documents sélectionnent les documents si 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 où la valeur du champ producer 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'
    }
});

26voto

krishna Points 56

Comme il y a beaucoup de confusion sur interroge une collection MongoDB avec des sous-documents J'ai pensé qu'il valait la peine d'expliquer les réponses ci-dessus avec des exemples :

Tout d'abord, j'ai inséré seulement deux objets dans la collection à savoir : message comme :

> db.messages.find().pretty()
{
    "_id" : ObjectId("5cce8e417d2e7b3fe9c93c32"),
    "headers" : {
        "From" : "reservations@marriott.com"
    }
}
{
    "_id" : ObjectId("5cce8eb97d2e7b3fe9c93c33"),
    "headers" : {
        "From" : "reservations@marriott.com",
        "To" : "kprasad.iitd@gmail.com"
    }
}
>

Alors quel est le résultat de la requête : db.messages.find({headers: {From: "reservations@marriott.com"} }).count()

Il devrait être un car ces requêtes pour des documents où headers égal à l'objet {From: "reservations@marriott.com"} ou nous devons spécifier le sous-document entier comme valeur d'un champ.

Donc, selon la réponse de @Edmondo1984

Les correspondances d'égalité à l'intérieur des sous-documents sélectionnent les documents si le sous-document correspond à l'un des critères suivants exactement le sous-document spécifié, y compris l'ordre des champs. .

À partir des déclarations ci-dessus, quel devrait être le résultat de la requête ci-dessous ?

> db.messages.find({headers: {To: "kprasad.iitd@gmail.com", From: "reservations@marriott.com"}  }).count()
0

Et si nous changions l'ordre des From y To c'est-à-dire les mêmes que les sous-documents des seconds documents ?

> db.messages.find({headers: {From: "reservations@marriott.com", To: "kprasad.iitd@gmail.com"}  }).count()
1

donc, il correspond exactement le sous-document spécifié, y compris l'ordre des champs. .

Pour l'utilisation de l'opérateur point, je pense que c'est très clair pour tout le monde. Voyons le résultat de la requête ci-dessous :

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

J'espère que ces explications avec l'exemple ci-dessus permettront à quelqu'un d'y voir plus clair sur recherche d'une requête avec des sous-documents .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X