Jak mogę użyć operatora „Not Like” w MongoDB

98

Potrafię używać Likeoperatora SQL używając pymongo,

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

Ale jak mogę używać Not Likeoperatora?

próbowałem

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

ale pojawił się błąd:

OperationFailure: $ not nie może mieć wyrażenia regularnego

KyungHoon Kim
źródło
1
Wiem, że to trochę za późno, ale w MongoDB 4.2 kombinacja operatora $noti $regexwydaje mi się działać.
b00r00x0

Odpowiedzi:

139

Z dokumentów :

Operator $ not nie obsługuje operacji z operatorem $ regex. Zamiast tego użyj // lub w interfejsach sterownika, użyj możliwości wyrażeń regularnych swojego języka do tworzenia obiektów wyrażeń regularnych. Rozważmy następujący przykład, w którym zastosowano wyrażenie dopasowania do wzorca //:

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

EDYCJA (@idbentley):

{$regex: 'ttt'}jest generalnie odpowiednikiem /ttt/in mongodb, więc zapytanie wyglądałoby następująco:

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

EDIT2 (@KyungHoon Kim):

W Pythonie działa poniżej:

'c':{'$not':re.compile('ttt')}
shx2
źródło
2
Żeby było jasne, {$regex: 'ttt'}jest generalnie równoważne z /ttt/in mongodb, więc twoje zapytanie wyglądałoby następująco db.test.find({c: {$not: /ttt/}}.
idbentley,
@idbentley dziękuję. Zaktualizowałem moją odpowiedź o Twoje wyjaśnienie.
shx2
1
Dziękuję bardzo. Dla innych ludzi użyłem 'c':{'$not':re.compile('ttt')}. Oczywiście, musi importować re
KyungHoon Kim
Wspaniały. Dodałem również twój komentarz do odpowiedzi, dla potomności.
shx2
1
Wydaje się, że wygląda to tak samo w przypadku $ ne i $ regex. Czy ktoś może to potwierdzić lub przynajmniej dodać do tego?
DBrown
56

Możesz zrobić z wyrażeniem regularnym, które nie zawiera słowa. Można również użyć $options => iw przypadku wyszukiwania niewrażliwego.

Nie zawiera string

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

Bez rozróżniania wielkości liter string

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

Zaczynać z string

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

Kończy się na string

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

Zawiera string

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

Zachowaj to jako zakładkę i odniesienie do innych zmian, których możesz potrzebować. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Somnath Muluk
źródło