Wie suche ich nach Dokumenten in einer Sammlung, in denen ein bestimmtes Feld in MongoDB fehlt?
107
Ja, es ist möglich, dass $ existiert :
db.things.find( { a : { $exists : false } } ); // return if a is missing
Wenn true, stimmt $ exist mit den Dokumenten überein, die das Feld enthalten, einschließlich Dokumenten, bei denen der Feldwert null ist. Wenn false, gibt die Abfrage nur die Dokumente zurück, die das Feld nicht enthalten.
$exist
Abfragen können keine Indizes verwenden (siehe mongodb.org/display/DOCS/… ).scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Wenn es Ihnen egal ist, ob das Feld fehlt oder
null
(oder wenn es nie istnull
), können Sie das etwas kürzere und sicherere verwenden:Es ist sicherer, weil
$exists
es zurückgibt,true
selbst wenn das Feld null ist, was oft nicht das gewünschte Ergebnis ist und zu einer NPE führen kann.quelle
null
und nicht fehlt. Dies ist tatsächlich ein unerwartetes Verhalten, da Sie nicht in der Lage wären, dasselbe zu tun0
(was auch der Fall istfalse
),null
was hier eine Art Ausnahme darstellt. Best Practice ist daher die besser lesbare Antwort,$exists: false
die nicht mehrdeutig ist. Denken Sie daran, dass Ihre etwas kürzere Variante nicht wirklich kürzer ist, wenn Sie diesen Kommentar dahinter haben müssen!a
, entweder weil esa
istnull
oder weila
es fehlt, dann$exists
ist es nicht gut genug, da es die Fälle, in denen esa
ist, nicht abfängtnull
.