как запрашивать дочерние объекты в mongodb

80

Я новичок в mongodb и пытаюсь запросить дочерние объекты. У меня есть набор состояний, и у каждого штата есть дочерние города. Один из городов имеет свойство Name, которое имеет значение null, что вызывает ошибки в моем приложении. Как мне запросить коллекции State, чтобы найти дочерние Cities с именем == 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});

потому что этот запрос вернет все документы без ключа (в нашем примере он вернет Испанию и Францию). Итак, если вы не уверены, что ключ всегда присутствует, вы должны проверить, существует ли ключ, как в первом запросе.

Хавьер Ферреро
источник