Поскольку существует большая путаница в запросах коллекции MongoDB с поддокументами , я подумал, что стоит объяснить приведенные выше ответы примерами:
Сначала я вставил только два объекта в коллекцию, а именно: message
как:
> 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"
}
}
>
Итак, каков результат запроса: db.messages.find({headers: {From: "reservations@marriott.com"} }).count()
Это должен быть один, потому что эти запросы для документов headers
равны объекту {From: "reservations@marriott.com"}
, т. Е. Не содержат других полей, или мы должны указать весь поддокумент в качестве значения поля.
Так что согласно ответу от @ Edmondo1984
Равенство совпадений внутри вложенных документов выбирает документы, если вложенный документ точно соответствует указанному вложенному документу, включая порядок полей .
Из приведенных выше утверждений, каков должен быть результат запроса ниже?
> db.messages.find({headers: {To: "kprasad.iitd@gmail.com", From: "reservations@marriott.com"} }).count()
0
А что, если мы изменим порядок From
и To
т. Е. Такие же, как субдокументы вторых документов?
> db.messages.find({headers: {From: "reservations@marriott.com", To: "kprasad.iitd@gmail.com"} }).count()
1
таким образом, он точно соответствует указанному поддокументу, включая порядок полей .
Для использования точечного оператора, я думаю, это очень ясно для каждого. Давайте посмотрим на результат запроса ниже:
> db.messages.find( { 'headers.From': "reservations@marriott.com" } ).count()
2
Я надеюсь, что эти объяснения с приведенным выше примером сделают кого-то более ясным при поиске запроса с поддокументами .