Як я можу використовувати оператор "Не подобається" в MongoDB


98

Я можу використовувати Likeоператор SQL за допомогою pymongo,

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

Але як я можу використовувати Not Likeоператор?

я намагався

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

але отримала помилку:

OperationFailure: $ not не може мати регулярний вираз


1
Я знаю, що це трохи пізно, але в MongoDB 4.2 оператор $notand і $regexв поєднанні, здається, працює для мене.
b00r00x0

Відповіді:


138

З документів :

Оператор $ not не підтримує операції з оператором $ regex. Натомість використовуйте // або в інтерфейсах драйверів, використовуйте можливість регулярного виразу вашої мови для створення об’єктів регулярних виразів. Розглянемо наступний приклад, який використовує вираз збігу шаблону //:

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

EDIT (@idbentley):

{$regex: 'ttt'}загалом еквівалентно /ttt/in mongodb, тому ваш запит стане:

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

EDIT2 (@KyungHoon Kim):

У python працює нижче:

'c':{'$not':re.compile('ttt')}

2
Щоб бути зрозумілим, {$regex: 'ttt'}це, як правило, еквівалент /ttt/in mongodb, тому ваш запит стане db.test.find({c: {$not: /ttt/}}.
idbentley

@idbentley дякую. Я оновив свою відповідь вашим роз’ясненням.
shx2

1
Дуже дякую. Для інших людей я використовував 'c':{'$not':re.compile('ttt')}. Звичайно, вам потрібен повторний імпорт
KyungHoon Kim

Чудово. Я також додав ваш коментар до відповіді для нащадків.
shx2

1
Здається, це той самий випадок із $ ne та $ регулярним виразом. Хтось може це підтвердити чи, принаймні, додати?
DBrown

55

Ви можете обійтися регулярним виразом, який не містить слова. Крім того, ви можете використовувати $options => iу випадку нечутливого пошуку.

Не містить string

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

Точний нечутливий регістр string

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

Починає з string

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

Закінчується на string

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

Містить string

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

Зберігайте це як закладку та посилання на будь-які інші зміни, які вам можуть знадобитися. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.