Монго: найти предметы, которые не имеют определенного поля

94

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

Теги:
null
exists

2 ответа

162
Лучший ответ

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

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

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

  • 1
    Имейте в виду, что запросы $exist не могут использовать индексы (см. Mongodb.org/display/DOCS/… ).
  • 4
    @Theo: Начиная с MongoDB 2.0 $ существует возможность использовать индексы ( jira.mongodb.org/browse/SERVER-393 )
Показать ещё 2 комментария
48

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню