Ponieważ istnieje wiele nieporozumień dotyczących zapytań dotyczących kolekcji MongoDB z dokumentami podrzędnymi , pomyślałem, że warto wyjaśnić powyższe odpowiedzi przykładami:
Najpierw wstawiłem tylko dwa obiekty do kolekcji, mianowicie: message
as:
> 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"
}
}
>
Jaki jest wynik zapytania: db.messages.find({headers: {From: "reservations@marriott.com"} }).count()
Powinno być jedno, ponieważ zapytania dotyczące dokumentów, w których jest headers
równy obiektowi {From: "reservations@marriott.com"}
, tzn. Nie zawiera innych pól, lub powinniśmy podać cały poddokument jako wartość pola.
Więc zgodnie z odpowiedzią z @ Edmondo1984
Dopasowania równości w dokumentach podrzędnych wybierają dokumenty, jeśli dokument podrzędny pasuje dokładnie do określonego dokumentu podrzędnego, w tym kolejności pól .
Z powyższych instrukcji, jaki powinien być wynik poniżej zapytania?
> db.messages.find({headers: {To: "kprasad.iitd@gmail.com", From: "reservations@marriott.com"} }).count()
0
A co, jeśli zmienimy kolejność, From
a To
więc taką samą jak poddokumenty drugich dokumentów?
> db.messages.find({headers: {From: "reservations@marriott.com", To: "kprasad.iitd@gmail.com"} }).count()
1
więc pasuje dokładnie do poddokumentu, w tym do kolejności pól .
Myślę, że użycie operatora kropki jest bardzo jasne dla każdego. Zobaczmy wynik poniższego zapytania:
> db.messages.find( { 'headers.From': "reservations@marriott.com" } ).count()
2
Mam nadzieję, że wyjaśnienia powyższego przykładu sprawią, że ktoś będzie bardziej przejrzysty w wyszukiwaniu zapytań z pod-dokumentami .