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

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


person bcmcfc    schedule 19.04.2011    source источник


Ответы (2)


Да, это возможно с помощью $exists:

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

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

person Andrew Orsich    schedule 19.04.2011
comment
Имейте в виду, что $exist запросы не могут использовать индексы (см. mongodb.org/display /ДОКС/). - person Theo; 19.04.2011
comment
@Theo: начиная с MongoDB 2.0 $exists может использовать индексы (jira.mongodb.org/browse /СЕРВЕР-393) - person Dmitry Schetnikovich; 23.11.2011
comment
Я хотел, чтобы Mongoid использовал его в прицеле. Выглядит так › scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}} - person genkilabs; 15.06.2012

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

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

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

person nilskp    schedule 30.11.2012
comment
Однако кто-то, читающий код, может интерпретировать его как поле, которое должно быть равно null и не отсутствовать. Это на самом деле неожиданное поведение, потому что вы не сможете сделать то же самое для 0 (что также false), поэтому null здесь является своего рода исключением. Поэтому наилучшей практикой является более читаемый ответ с использованием $exists: false, который не является двусмысленным. Помните, что ваш немного более короткий вариант на самом деле не короче, если вам нужен этот комментарий! - person Yeti; 03.09.2018
comment
@Yeti, если моя цель состоит в том, чтобы найти все объекты, в которых отсутствует значение для поля a, либо потому, что a равно null, либо потому, что a отсутствует, то $exists недостаточно, так как он не будет улавливать случаи, когда a равно null. - person nilskp; 07.09.2018