Монго: знайдіть елементи, які не мають певного поля


107

Як шукати документи у колекції, у яких відсутнє певне поле в MongoDB?

Відповіді:


171

Так, можливо, використовуючи $ postoji :

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

Коли вірно, $ існує, що відповідає документам, що містять поле, включаючи документи, у яких значення поля є нульовим. Якщо помилково, запит повертає лише документи, які не містять поля.


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

4
@Theo: Починаючи з MongoDB 2.0 $ існує можливість користуватися індексами ( jira.mongodb.org/browse/SERVER-393 )
Дмитро

Я був після цього, щоб Монгоїд використав у масштабі. Виглядає так>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навіть якщо поле є нульовим, що часто не є бажаним результатом і може призвести до NPE.


1
Однак хтось, хто читає код, може трактувати його, оскільки поле має бути рівним nullі не пропускати. Це насправді несподівана поведінка, тому що ви б не змогли зробити те ж саме для 0(що також є false), тому тут nullє свого роду виняток. Тому найкраща практика - це більш читабельна відповідь, використання $exists: falseякої неоднозначно. Пам’ятайте, ваш трохи коротший варіант насправді не коротший, якщо вам потрібно мати за цим коментарем!
Єті

@Yeti, якщо моя мета - знайти всі об'єкти, яким не вистачає значення для поля a, або тому, що aє, nullабо тому, що aвін відсутній, тоді $existsце недостатньо добре, тому що він не вловлює випадки, коли aє null.
nilskp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.