Mongo: znajdź przedmioty, które nie mają określonego pola

107

Jak wyszukiwać dokumenty w kolekcji, w których brakuje określonego pola w MongoDB?

bcmcfc
źródło

Odpowiedzi:

171

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.

Andrew Orsich
źródło
1
Ostrzegamy, $existzapytania nie mogą używać indeksów (patrz mongodb.org/display/DOCS/ ... ).
Theo
4
@Theo: Począwszy od MongoDB 2.0 $ istnieje możliwość korzystania z indeksów ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich
Chciałem, żeby Mongoid użył w lunecie. Wygląda tak>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs
50

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ż $existszwróci, truenawet jeśli pole jest puste, co często nie jest pożądanym wynikiem i może prowadzić do NPE.

nilskp
źródło
1
Jednak ktoś czytający kod może go zinterpretować, ponieważ pole musi być równe nulli 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 nulljest to rodzaj wyjątku. Dlatego najlepszą praktyką jest bardziej czytelna odpowiedź, $exists: falsektóra nie jest niejednoznaczna. Pamiętaj, że twój nieco krótszy wariant nie jest tak naprawdę krótszy, jeśli potrzebujesz tego komentarza!
Yeti
@Yeti jeśli moim celem jest znalezienie wszystkich obiektów, które są brakujących wartości dla pola a, albo dlatego, że ajest nullalbo ponieważ abrakuje, to $existsnie jest wystarczająco dobre, gdyż nie złapie przypadki, gdzie ajest null.
nilskp