2013-04-14 4 views
135

У меня есть проблема при запросе MongoDB с вложенными объектами обозначения:Как запросить вложенные объекты?

db.messages.find({ headers : { From: "[email protected]" } }).count() 
0 
db.messages.find({ 'headers.From': "[email protected]" } ).count() 
5 

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

ответ

276

db.messages.find({ headers : { From: "[email protected]" } })

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


db.messages.find({ 'headers.From': "[email protected]" } )

Это выглядит только на headers.From поле, не зависит от других полей, содержащиеся в, или отсутствует, headers.


Dot-notation docs

+0

Есть ли способ сделать это без кавычек вокруг "headers.From"? – trysis

+2

@trysis для чего? – shx2

+0

Я не знаю, просто интересно, и подумал, что иногда это может быть полезно. – trysis

16

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

Когда поле содержит встроенный документ (т.е. поддокумент) , вы можете либо указать весь вложенный документ как значение поля, либо «достигнуть» в подвале , используя точечную нотацию, чтобы указать значения для отдельных полей в поддокументе:

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


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

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

Я сошел с ума. Это кажется мне совершенно непоследовательным, потому что при запросе объектов его прямые свойства могут быть сопоставлены в любом порядке. – Capaj