Mongo: Finde Gegenstände, die kein bestimmtes Feld haben

107

Wie suche ich nach Dokumenten in einer Sammlung, in denen ein bestimmtes Feld in MongoDB fehlt?

bcmcfc
quelle

Antworten:

171

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.

Andrew Orsich
quelle
1
Seien Sie gewarnt, $existAbfragen können keine Indizes verwenden (siehe mongodb.org/display/DOCS/… ).
Theo
4
@ Theo: Ab MongoDB 2.0 $ existiert in der Lage, Indizes zu verwenden ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich
Ich war danach für Mongoid in einem Bereich zu verwenden. Sieht so aus>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Genkilabs
50

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.

nilskp
quelle
1
Jemand, der den Code liest, könnte ihn jedoch so interpretieren, dass das Feld gleich sein muss 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!
Yeti
@Yeti, wenn mein Ziel darin besteht, alle Objekte zu finden, denen ein Wert für das Feld fehlt 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.
Nilskp