Как запросить вложенные объекты?


У меня проблема при запросе mongoDB с вложенными объектами нотации:

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

Я не вижу, что я делаю неправильно. Я ожидаю, что нотация вложенных объектов вернет тот же результат, что и запрос точечной нотации. Где я ошибаюсь?

2 159

2 ответа:

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

это запросы для документов, где headersравна{ From: ... }, т. е. не содержит никаких других областях.


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

это только смотрит на headers.From поле, не затронутое другими полями, содержащимися или отсутствующими в, headers.


Dot-notation docs

два механизма запроса работают по-разному, как это предлагается в документы в раздел вложенных документов:

когда поле содержит внедренный документ (т. е.,subdocument), вы можете либо указать всю subdocument как значение поля, или "reach into"subdocument С помощью точечной нотации, чтобы указать значения для отдельных полей в subdocument:

равенство совпадения внутри вложенных документов выберите документы, если вложенный документ точно соответствует указанному вложенному документу, включая порядок полей.


в следующем примере запрос соответствует всем документам, где значение источника поля является вложенным документом, содержащим только поле company со значением 'ABC123' и поле address со значением '123 Street', в точном порядке:

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});