Я новичок в mongodb и пытаюсь запросить дочерние объекты. У меня есть коллекция государств, и у каждого государства есть детские города. У одного из городов есть свойство Name, которое равно null, что вызывает ошибки в моем приложении. Как я могу запросить коллекции State для поиска дочерних городов, которые имеют имя == null?
Как запросить дочерние объекты в mongodb
Ответ 1
Если это точно 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}}
]})
Ответ 2
Предполагая, что ваша сборка состояний выглядит следующим образом:
{"name" : "Spain", "cities" : [ { "name" : "Madrid" }, { "name" : null } ] }
{"name" : "France" }
Запрос на поиск состояний с нулевыми городами будет выглядеть следующим образом:
db.states.find({"cities.name" : {"$eq" : null, "$exists" : true}});
Это обычная ошибка для запроса нулей как:
db.states.find({"cities.name" : null});
потому что этот запрос вернет все документы без ключа (в нашем примере он вернет Испанию и Францию). Итак, если вы не уверены, что ключ всегда присутствует, вы должны проверить, что ключ существует как в первом запросе.