MongoDB ungleich


102

Ich versuche, eine Abfrage in MongoDB anzuzeigen, bei der ein Textfeld nicht '' (leer) ist.

{ 'name' : { $not : '' }}

Ich bekomme jedoch den Fehler invalid use of $not

Ich habe die Dokumentation durchgesehen, aber die Beispiele, die sie verwenden, sind für komplizierte Fälle (mit regulärem Ausdruck und Negieren eines $notanderen Operators).

Wie würde ich das einfache tun, was ich versuche?

Antworten:


147

Verwendung $ne- $notsollte vom Standardoperator befolgt werden:

Ein Beispiel für $ne, das für ungleich steht:

use test
switched to db test
db.test.insert({author : 'me', post: ""})
db.test.insert({author : 'you', post: "how to query"})
db.test.find({'post': {$ne : ""}})
{ "_id" : ObjectId("4f68b1a7768972d396fe2268"), "author" : "you", "post" : "how to query" }

Und nun $not, das Prädikat ( $ne) aufnimmt und negiert ( $not):

db.test.find({'post': {$not: {$ne : ""}}})
{ "_id" : ObjectId("4f68b19c768972d396fe2267"), "author" : "me", "post" : "" }

4
Für die Neugierigen bedeutet $ne"nicht gleich".
Abraham

1
Diese Antwort hat eine große Anzahl von Stimmen, aber die Erklärung ist sehr unklar. Was passiert in dem Beispiel, das sowohl das $ not als auch das $ ne hat?
GaTechThomas

so kurz $not :{ $neMittel $eq, ist es das , was Sie sagen wollten?
Anu

61

Wenn Sie mehrere $nemachen möchten, dann tun Sie dies

db.users.find({name : {$nin : ["mary", "dick", "jane"]}})


10

Aus den Mongo-Dokumenten :

Der $notOperator betrifft nur andere Operatoren und kann Felder und Dokumente nicht unabhängig voneinander prüfen. Verwenden Sie also den $notOperator für logische Disjunktionen und den $neOperator, um den Inhalt von Feldern direkt zu testen.

Da Sie das Feld direkt testen, $neist dies der richtige Operator.

Bearbeiten:

Eine Situation, in der Sie verwenden möchten, $notist:

db.inventory.find( { price: { $not: { $gt: 1.99 } } } )

Das würde alle Dokumente auswählen, bei denen:

  • Der Preisfeldwert ist kleiner oder gleich 1,99 oder der Preis
  • Feld existiert nicht

3

Wenn nullein Array ein enthält und Sie es vermeiden möchten:

db.test.find({"contain" : {$ne :[] }}).pretty()

1

Beispiel aus dem wirklichen Leben; finde alle aber nicht aktuellen Benutzer:

var players = Players.find({ my_x: player.my_x,  my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
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.