як запитувати дочірні об'єкти в mongodb - -


80

Я новачок у mongodb і намагаюся запитувати дочірні об'єкти. У мене є колекція штатів, і кожен штат має дочірні міста. Одне з міст має властивість Name, яке має значення null, що спричиняє помилки в моєму додатку. Як я можу запитати державні колекції, щоб знайти дочірні міста, які мають ім’я == null?

Відповіді:


114

Якщо це точно null(на відміну від не встановленого):

db.states.find({"cities.name": null})

(але, як зазначає javierfp, він також відповідає документам, які взагалі не мають масиву міст, я припускаю, що вони мають).

Якщо випадок, що властивість не встановлено:

db.states.find({"cities.name": {"$exists": false}})

Я протестував вищезазначене з колекцією, створеною за допомогою цих двох вставок:

db.states.insert({"cities": [{name: "New York"}, {name: null}]})
db.states.insert({"cities": [{name: "Austin"}, {color: "blue"}]})

Перший запит знаходить перший стан, другий запит - другий. Якщо ви хочете знайти їх обох за допомогою одного запиту, ви можете зробити $orзапит:

db.states.find({"$or": [
  {"cities.name": null}, 
  {"cities.name": {"$exists": false}}
]})

як я можу отримати всі дочірні об'єкти. використовуючи проекцію, я просто отримую одне майно
Yashraj basan

38

Якщо припустити, що ваша колекція "штати" подібна до:

{"name" : "Spain", "cities" : [ { "name" : "Madrid" }, { "name" : null } ] }
{"name" : "France" }

Запит на пошук штатів з нульовими містами буде таким:

db.states.find({"cities.name" : {"$eq" : null, "$exists" : true}});

Поширеною помилкою є запит для нулів як:

db.states.find({"cities.name" : null});

оскільки цей запит поверне всі документи, в яких бракує ключа (у нашому прикладі поверне Іспанію та Францію). Отже, якщо ви не впевнені, що ключ завжди присутній, ви повинні перевірити, чи існує ключ, як у першому запиті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.