Jak wyszukiwać dokumenty w kolekcji, w których brakuje określonego pola w MongoDB?
107
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.
$exist
zapytania nie mogą używać indeksów (patrz mongodb.org/display/DOCS/ ... ).scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Jeśli nie obchodzi Cię, czy brakuje pola lub
null
(lub nigdy go nie manull
), możesz użyć nieco krótszego i bezpieczniejszego: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.źródło
null
i nie może go brakować. W rzeczywistości jest to nieoczekiwane zachowanie, ponieważ nie byłbyś w stanie zrobić tego samego dla0
(co też jestfalse
), więcnull
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, żea
jestnull
albo ponieważa
brakuje, to$exists
nie jest wystarczająco dobre, gdyż nie złapie przypadki, gdziea
jestnull
.