Como posso usar o operador 'Não gosto' no MongoDB

98

Posso usar o SQL LikeOperator usando pymongo,

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

Mas como posso usar o Not LikeOperator?

eu tentei

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

mas obteve um erro:

OperationFailure: $ not não pode ter um regex

KyungHoon Kim
fonte
1
Eu sei que é um pouco tarde, mas no MongoDB 4.2 o operador $note $regexem combinação parece funcionar para mim.
b00r00x0

Respostas:

138

Dos documentos :

O operador $ not não oferece suporte a operações com o operador $ regex. Em vez disso, use // ou em suas interfaces de driver, use o recurso de expressão regular de sua linguagem para criar objetos de expressão regular. Considere o seguinte exemplo que usa a expressão de correspondência de padrão //:

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

EDIT (@idbentley):

{$regex: 'ttt'}geralmente é equivalente a /ttt/em mongodb, então sua consulta se tornaria:

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

EDIT2 (@KyungHoon Kim):

Em python , abaixo funciona:

'c':{'$not':re.compile('ttt')}
shx2
fonte
2
Para ser claro, {$regex: 'ttt'}geralmente é equivalente a /ttt/em mongodb, então sua consulta se tornaria db.test.find({c: {$not: /ttt/}}.
idbentley
@idbentley obrigado. Eu atualizei minha resposta com seu esclarecimento.
shx2
1
Muito obrigado. Para outras pessoas, eu usei 'c':{'$not':re.compile('ttt')}. Claro, você precisa importar novamente
KyungHoon Kim
Ótimo. Também acrescentei seu comentário à resposta, para a posteridade.
shx2
1
Este parece ser o mesmo caso com $ ne e $ regex. Alguém pode confirmar isso, ou pelo menos acrescentar algo?
DBrown
55

Você pode fazer com regex que não contém uma palavra. Além disso, você pode usar $options => ipara o caso de pesquisa insensível.

Não contém string

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

Não diferencia exatamente maiúsculas de minúsculas string

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

Começa com string

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

Termina com string

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

Contém string

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

Guarde-o como um marcador e uma referência para quaisquer outras alterações que você possa precisar. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Somnath Muluk
fonte