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

123

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

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

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

Теги:
mongodb-query
syntax
nested
bson

2 ответа

259
Лучший ответ

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

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


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

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


Документы с точными нотами

  • 0
    Есть ли способ сделать это без кавычек вокруг "заголовки. От"?
  • 3
    @trysis для чего?
Показать ещё 5 комментариев
15

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

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

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


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

db.inventory.find( {
    producer: {
        company: 'ABC123',
        address: '123 Street'
    }
});
  • 8
    Я сходил с ума. Это кажется мне довольно противоречивым, потому что при запросе объектов его прямые свойства могут быть сопоставлены в любом порядке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню