Wie kann ich den Operator 'Not Like' in MongoDB verwenden?

98

Ich kann den SQL- LikeOperator verwenden mit pymongo,

db.test.find({'c':{'$regex':'ttt'}})

Aber wie kann ich Not LikeOperator verwenden?

Ich habe es versucht

db.test.find({'c':{'$not':{'$regex':'ttt'}})

habe aber Fehler bekommen:

OperationFailure: $ kann keinen regulären Ausdruck haben

KyungHoon Kim
quelle
Ich weiß, dass dies ein bisschen spät ist, aber in MongoDB 4.2 scheint der Operator $notund $regexin Kombination für mich zu funktionieren.
b00r00x0

Antworten:

138

Aus den Dokumenten :

Der Operator $ not unterstützt keine Operationen mit dem Operator $ regex. Verwenden Sie stattdessen // oder in Ihren Treiberschnittstellen die Funktion für reguläre Ausdrücke Ihrer Sprache, um Objekte für reguläre Ausdrücke zu erstellen. Betrachten Sie das folgende Beispiel, das den Musterübereinstimmungsausdruck // verwendet:

db.inventory.find( { item: { $not: /^p.*/ } } )

EDIT (@idbentley):

{$regex: 'ttt'}ist im Allgemeinen gleichbedeutend mit /ttt/in mongodb, daher würde Ihre Anfrage wie folgt lauten:

db.test.find({c: {$not: /ttt/}}

EDIT2 (@KyungHoon Kim):

In Python funktioniert unten:

'c':{'$not':re.compile('ttt')}
shx2
quelle
2
Um klar zu sein, {$regex: 'ttt'}ist im Allgemeinen gleichbedeutend mit /ttt/in mongodb, so dass Ihre Anfrage werden würde db.test.find({c: {$not: /ttt/}}.
Idbentley
@idbentley danke. Ich habe meine Antwort mit Ihrer Klarstellung aktualisiert.
Shx2
1
Ich danke dir sehr. Für andere Leute habe ich verwendet 'c':{'$not':re.compile('ttt')}. Natürlich müssen Sie erneut importieren
KyungHoon Kim
Toll. Ich habe der Antwort auch Ihren Kommentar für die Nachwelt hinzugefügt.
Shx2
1
Dies scheint bei $ ne und $ regex der gleiche Fall zu sein. Kann jemand dies bestätigen oder zumindest ergänzen?
DBrown
55

Sie können mit Regex arbeiten, der kein Wort enthält. Sie können auch $options => ifür den Fall einer unempfindlichen Suche verwenden.

Enthält nicht string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

Genaue Groß- und Kleinschreibung wird nicht berücksichtigt string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

Beginnt mit string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

Endet mit string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

Enthält string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

Bewahren Sie dies als Lesezeichen und Referenz für andere Änderungen auf, die Sie möglicherweise benötigen. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Somnath Muluk
quelle