Abfrage für boolesches Feld als "nicht wahr" (z. B. entweder falsch oder nicht vorhanden)
Ich bin sicher, ich bin fehlt etwas sehr Grundsätzliches in MongoDB-Abfragen, kann nicht scheinen, um diese einfache Bedingung.
Betrachten Sie diese Sammlung
> db.tests.find()
{ "_id" : ObjectId("..."), "name" : "Test1" , "deleted" : true}
{ "_id" : ObjectId("..."), "name" : "Test2" , "deleted" : false}
{ "_id" : ObjectId("..."), "name" : "Test3" }
Möchte ich einfach auf Abfrage alle Elemente, die "nicht gelöscht"
Ich weiß, wie zu finden das Element, das ein "gelöscht" - flag auf true gesetzt:
> db.tests.find({deleted:true})
{ "_id" : ObjectId("..."), "name" : "Test1" , "deleted" : true}
Aber wie finde ich alle Elemente, die NICHT "deleted"
(z.B. negieren der obigen Abfrage, oder in anderen Worten, alle Elemente, die entweder nicht über eine "deleted"
Feld, oder haben es mit Wert false
, Was ich versucht habe durch erraten (bitte nicht lachen...)
> db.tests.find({$not : {deleted: true}})
(gibt keine Ergebnisse zurück)
> db.tests.find({$not : {$eq:{deleted:true}}})
Fehler: { "$err" : "Ungültiger operator: $eq", "code" : 10068 }
> db.tests.find({deleted:{$not: true}})
Fehler: { "$err" : "ungültige Verwendung von "$not", "code" : 13041 }
> db.tests.find({deleted:{$not: {$eq:true}}})
Fehler: { "$err" : "ungültige Verwendung von "$not", "code" : 13034 }
Was bin ich?
InformationsquelleAutor der Frage Eran Medan | 2013-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wo
$ne
steht für "nicht gleich". (Dokumentation über die mongodb-Betreiber)InformationsquelleAutor der Antwort Sergio Tulentsev
Der Vollständigkeit halber, ein anderer Weg, dies zu tun ist mit
$in
:Einschließlich
null
im array zieht in den docs, wo diedeleted
Feld fehlt. Diese Abfrage kann einen index verwenden, der auf{deleted: 1}
im aktuellen 2.6.6 MongoDB Version.InformationsquelleAutor der Antwort JohnnyHK
JohnnyHK hat die beste Antwort. Die
$in
Selektor ist der kürzeste und sauberste IMO.Wird dieser test genau "falsch" oder "nicht existent". Und indiziert werden können.
Ein Beispiel mit Verwendung eines index.
Diese gedruckt werden soll
InformationsquelleAutor der Antwort tidwall
Für den Fall, dass jemand muss diese in eine aggregation pipeline statt
find
, das ist was für mich gearbeitetNach dem hinzufügen der extra-Feld können Sie weiter mit dem pipeline-Stufen und haben die Informationen, die Sie verpassen
InformationsquelleAutor der Antwort JohnPan
Im Falle Sie suchen mongoid syntax (ich bin mit diesem in eine rails-app), dies ist, was ich kam mit eine Unternehmens-Benutzer:
InformationsquelleAutor der Antwort Jon Kern