Odpowiedzi:
Tak, możliwe jest użycie $ istnieje :
db.things.find( { a : { $exists : false } } ); // return if a is missing
Gdy ma wartość prawda, $ istnieje odpowiada dokumentom zawierającym pole, w tym dokumentom, w których pole ma wartość null. Jeśli jest fałszywe, zapytanie zwraca tylko dokumenty, które nie zawierają pola.
scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Jeśli nie obchodzi Cię, czy brakuje pola lub null
(lub nigdy go nie ma null
), możesz użyć nieco krótszego i bezpieczniejszego:
db.things.find( { a : null } ); // return if a is missing or null
Jest to bezpieczniejsze, ponieważ $exists
zwróci, true
nawet jeśli pole jest puste, co często nie jest pożądanym wynikiem i może prowadzić do NPE.
null
i nie może go brakować. W rzeczywistości jest to nieoczekiwane zachowanie, ponieważ nie byłbyś w stanie zrobić tego samego dla 0
(co też jest false
), więc null
jest to rodzaj wyjątku. Dlatego najlepszą praktyką jest bardziej czytelna odpowiedź, $exists: false
która nie jest niejednoznaczna. Pamiętaj, że twój nieco krótszy wariant nie jest tak naprawdę krótszy, jeśli potrzebujesz tego komentarza!
a
, albo dlatego, że a
jest null
albo ponieważ a
brakuje, to $exists
nie jest wystarczająco dobre, gdyż nie złapie przypadki, gdzie a
jest null
.
$exist
zapytania nie mogą używać indeksów (patrz mongodb.org/display/DOCS/ ... ).