¿Cómo puedo usar el operador 'No me gusta' en MongoDB?

98

Puedo usar el Likeoperador SQL usando pymongo,

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

Pero, ¿cómo puedo usar Not LikeOperator?

Lo intenté

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

pero obtuve un error:

OperationFailure: $ not no puede tener una expresión regular

KyungHoon Kim
fuente
1
Sé que esto es un poco tarde, pero en MongoDB 4.2, el operador $noty $regexen combinación parece funcionar para mí.
b00r00x0

Respuestas:

138

De los documentos :

El operador $ not no admite operaciones con el operador $ regex. En su lugar, use // o en sus interfaces de controlador, use la capacidad de expresión regular de su lenguaje para crear objetos de expresión regular. Considere el siguiente ejemplo que usa la expresión de coincidencia de patrón //:

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

EDITAR (@idbentley):

{$regex: 'ttt'}es generalmente equivalente a /ttt/en mongodb, por lo que su consulta se convertiría en:

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

EDIT2 (@KyungHoon Kim):

En Python , debajo de uno funciona:

'c':{'$not':re.compile('ttt')}
shx2
fuente
2
Para ser claros, {$regex: 'ttt'}generalmente es equivalente a /ttt/en mongodb, por lo que su consulta se convertiría en db.test.find({c: {$not: /ttt/}}.
idbentley
@idbentley gracias. Actualicé mi respuesta con tu aclaración.
shx2
1
Muchas gracias. Para otras personas, usé 'c':{'$not':re.compile('ttt')}. Por supuesto, necesita importar re
KyungHoon Kim
Excelente. También agregué tu comentario a la respuesta, para la posteridad.
shx2
1
Este parece ser el mismo caso con $ ne y $ regex. ¿Alguien puede confirmar esto, o al menos agregar algo más?
DBrown
55

Puede hacerlo con expresiones regulares que no contienen una palabra. Además, puede utilizar $options => ipara el caso de búsqueda insensible.

No contiene string

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

No distingue entre mayúsculas y minúsculas string

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

Comienza con string

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

Termina con string

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

Contiene string

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

Conserve esto como un marcador y una referencia para cualquier otra modificación que pueda necesitar. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Somnath Muluk
fuente