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 $existses zurückgibt, trueselbst wenn das Feld null ist, was oft nicht das gewünschte Ergebnis ist und zu einer NPE führen kann.
nullund 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), nullwas hier eine Art Ausnahme darstellt. Best Practice ist daher die besser lesbare Antwort, $exists: falsedie 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 aist nulloder weil aes fehlt, dann $existsist es nicht gut genug, da es die Fälle, in denen es aist, nicht abfängt null.
$existAbfragen können keine Indizes verwenden (siehe mongodb.org/display/DOCS/… ).