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?

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.