Comment puis-je utiliser l'opérateur 'Not Like' dans MongoDB

98

Je peux utiliser l' Likeopérateur SQL en utilisant pymongo,

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

Mais comment puis-je utiliser Not LikeOperator?

j'ai essayé

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

mais j'ai eu une erreur:

OperationFailure: $ not ne peut pas avoir de regex

KyungHoon Kim
la source
1
Je sais que c'est un peu tard mais dans MongoDB 4.2, l' opérateur $notand $regexen combinaison semble fonctionner pour moi.
b00r00x0

Réponses:

139

À partir de la documentation :

L'opérateur $ not ne prend pas en charge les opérations avec l'opérateur $ regex. Utilisez plutôt // ou dans vos interfaces de pilote, utilisez la capacité d'expression régulière de votre langage pour créer des objets d'expression régulière. Prenons l'exemple suivant qui utilise l'expression de correspondance de modèle //:

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

EDIT (@idbentley):

{$regex: 'ttt'}est généralement équivalent à /ttt/dans mongodb, donc votre requête deviendrait:

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

EDIT2 (@KyungHoon Kim):

En python , ci-dessous on fonctionne:

'c':{'$not':re.compile('ttt')}
shx2
la source
2
Pour être clair, {$regex: 'ttt'}est généralement équivalent à /ttt/mongodb, donc votre requête deviendrait db.test.find({c: {$not: /ttt/}}.
idbentley
@idbentley merci. J'ai mis à jour ma réponse avec votre clarification.
shx2
1
Merci beaucoup. Pour d'autres personnes, j'ai utilisé 'c':{'$not':re.compile('ttt')}. Bien sûr, vous devez importer re
KyungHoon Kim
Génial. J'ai également ajouté votre commentaire à la réponse, pour la postérité.
shx2
1
Cela semble être le même cas avec $ ne et $ regex. Quelqu'un peut-il le confirmer, ou du moins y ajouter?
DBrown
55

Vous pouvez faire avec regex qui ne contient pas un mot. En outre, vous pouvez utiliser$options => i pour le cas de recherche insensible.

Ne contient pas string

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

Insensible à la casse exacte string

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

Commence avec string

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

Se termine par string

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

Contient string

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

Conservez-le comme signet et comme référence pour toute autre modification dont vous pourriez avoir besoin. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Somnath Muluk
la source