Antworten:
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.
scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Wenn es Ihnen egal ist, ob das Feld fehlt oder null
(oder wenn es nie ist null
), können Sie das etwas kürzere und sicherere verwenden:
db.things.find( { a : null } ); // return if a is missing or null
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.
null
und nicht fehlt. Dies ist tatsächlich ein unerwartetes Verhalten, da Sie nicht in der Lage wären, dasselbe zu tun 0
(was auch der Fall ist false
), 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 es a
ist null
oder weil a
es fehlt, dann $exists
ist es nicht gut genug, da es die Fälle, in denen es a
ist, nicht abfängt null
.
$exist
Abfragen können keine Indizes verwenden (siehe mongodb.org/display/DOCS/… ).