Ответы:
Да, можно использовать $ exists :
db.things.find( { a : { $exists : false } } ); // return if a is missing
Если истинно, $ exists соответствует документам, содержащим поле, включая документы, в которых значение поля равно null. Если false, запрос возвращает только те документы, которые не содержат поля.
scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Если вам все равно, если поле отсутствует или null(или никогда null), вы можете использовать немного короче и безопаснее:
db.things.find( { a : null } ); // return if a is missing or null
Это безопаснее, потому $existsчто вернет, trueдаже если поле имеет значение NULL, что часто не является желаемым результатом и может привести к NPE.
nullа не отсутствовать. На самом деле это неожиданное поведение, потому что вы не сможете сделать то же самое для 0(что тоже есть false), поэтому nullэто своего рода исключение. Следовательно, наилучшая практика - это более читаемый ответ, $exists: falseкоторый не является двусмысленным. Помните, что ваш немного более короткий вариант на самом деле не короче, если вам нужен этот комментарий!
a, либо потому, что aоно , либо потому, nullчто aоно отсутствует, то $existsэтого недостаточно, так как он не улавливает случаи, когда aесть null.
$existзапросы не могут использовать индексы (см. Mongodb.org/display/DOCS/… ).