Mongo: найти предметы, у которых нет определенного поля


107

Как искать документы в коллекции, в которых отсутствует определенное поле в MongoDB?

Ответы:


171

Да, можно использовать $ exists :

db.things.find( { a : { $exists : false } } ); // return if a is missing

Если истинно, $ exists соответствует документам, содержащим поле, включая документы, в которых значение поля равно null. Если false, запрос возвращает только те документы, которые не содержат поля.


1
Будьте осторожны, $existзапросы не могут использовать индексы (см. Mongodb.org/display/DOCS/… ).
Тео

4
@Theo: Начиная с MongoDB 2.0 $ существует, может использовать индексы ( jira.mongodb.org/browse/SERVER-393 )
Дмитрий Щетникович

Я хотел использовать Mongoid в прицеле. Похоже на это>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

Если вам все равно, если поле отсутствует или null(или никогда null), вы можете использовать немного короче и безопаснее:

db.things.find( { a : null } ); // return if a is missing or null

Это безопаснее, потому $existsчто вернет, trueдаже если поле имеет значение NULL, что часто не является желаемым результатом и может привести к NPE.


1
Однако кто-то, читающий код, может интерпретировать его как поле должно быть равно, nullа не отсутствовать. На самом деле это неожиданное поведение, потому что вы не сможете сделать то же самое для 0(что тоже есть false), поэтому nullэто своего рода исключение. Следовательно, наилучшая практика - это более читаемый ответ, $exists: falseкоторый не является двусмысленным. Помните, что ваш немного более короткий вариант на самом деле не короче, если вам нужен этот комментарий!
Yeti

@Yeti, если моя цель - найти все объекты, у которых отсутствует значение для поля a, либо потому, что aоно , либо потому, nullчто aоно отсутствует, то $existsэтого недостаточно, так как он не улавливает случаи, когда aесть null.
nilskp 07
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.