У меня проблема при запросе mongoDB с вложенными объектами:
db.messages.find( { headers : { From: "[email protected]" } } ).count()
0
db.messages.find( { 'headers.From': "[email protected]" } ).count()
5
Я не вижу, что я делаю неправильно. Я ожидаю, что вложенное обозначение объекта вернет тот же результат, что и запрос точечной нотации. Где я ошибаюсь?
db.messages.find( { headers : { From: "[email protected]" } } )
Это запросы для документов, где headers
равно { From: ... }
, т.е. не содержит других полей.
db.messages.find( { 'headers.From': "[email protected]" } )
Это относится только к полю headers.From
, не затронутому другими полями, содержащимися или отсутствующими в headers
.
Два механизма запроса работают по-разному, как предложено в документах в разделе Поддокументы:
Если поле содержит встроенный документ (т.е. поддокумент), вы можете указать весь поддокумент как значение поля или "достигнуть" вложенного документа с использованием точечной нотации, чтобы указать значения для отдельных полей в поддокументе
Соображения равенства в поддокументах выбирают документы, если поддокумент соответствует точно указанному вложенному документу, включая порядок полей.
В следующем примере запрос соответствует всем документам, в которых значение производителя поля является поддокументом, содержащим только поле company
со значением 'ABC123'
и поле address
со значением '123 Street'
, в точном порядке:
db.inventory.find( {
producer: {
company: 'ABC123',
address: '123 Street'
}
});