Как я могу использовать оператор Not Like в 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 $notи $regexоператор в комбинации , кажется, работает для меня.
b00r00x0

Ответы:

139

Из документов :

Оператор $ not не поддерживает операции с оператором $ regex. Вместо этого используйте // или в интерфейсах драйвера используйте возможность регулярного выражения вашего языка для создания объектов регулярных выражений. Рассмотрим следующий пример, в котором используется выражение сопоставления с шаблоном //:

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

EDIT (@idbentley):

{$regex: 'ttt'}обычно эквивалентен /ttt/в mongodb, поэтому ваш запрос будет выглядеть следующим образом:

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

EDIT2 (@KyungHoon Ким):

В python работает один ниже:

'c':{'$not':re.compile('ttt')}
shx2
источник
2
Для ясности, {$regex: 'ttt'}обычно это эквивалент /ttt/в mongodb, поэтому ваш запрос будет иметь вид db.test.find({c: {$not: /ttt/}}.
idbentley
@idbentley, спасибо. Я обновил свой ответ вашим пояснением.
shx2
1
Огромное спасибо. Для других я использовал 'c':{'$not':re.compile('ttt')}. Конечно, вам нужен реимпорт
Кюн Хун Ким
Отлично. Я также добавил ваш комментарий к ответу для потомков.
shx2
1
Похоже, то же самое и с $ ne и $ regex. Кто-нибудь может это подтвердить или хотя бы добавить к этому?
DBrown
56

Вы можете использовать регулярное выражение, которое не содержит слова. Также вы можете использовать $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/

Сомнатх Мулук
источник