Recherche insensible à la casse dans Mongo

j'utilise une recherche insensible à la casse dans Mongo, quelque chose de similaire à https://stackoverflow.com/q/5500823/1028488 .

ie I am using a regex with options I. Mais j'ai du mal à limiter le regex à ce seul mot, il fonctionne plus comme un' comme 'en SQL

eg: si j'utilise requête comme {"SearchWord" : { '$regex' : 'win', $options: '-i' }} , il me montre les résultats pour win, window & winter. Comment puis-je restreindre à juste montrer victoire?

j'ai essayé /^win$/ mais c'est dit dans JSON invalide.... S'il vous plaît suggérer un moyen.

Merci d'avance

38
demandé sur Community 2011-11-23 20:53:00

5 réponses

vous pouvez utiliser '$regex':'^win$' ou /^win$/i (noter aucune citation sur le second)

Source ici : Regex dans les requêtes avec Mongo

38
répondu AlphaB 2011-11-23 17:11:11

vous pouvez utiliser $options => i pour la recherche insensible à la casse. Donnant quelques exemples possibles requis pour la correspondance string.

Exact insensible à la casse string

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

contient string

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

commence par string

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

fin avec string

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

ne contient pas string

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

conservez ceci comme un signet, et une référence pour toute autre modification que vous pourriez avoir besoin. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions /

69
répondu Somnath Muluk 2018-02-16 09:27:31

UPDATE : en MongoDB 2.4, on utilisera un index "texte" et une requête de recherche en texte intégral pour ce faire. Vous pouvez lire à leur sujet ici . Si vous utilisez un MongoDB récent, l'approche ci-dessous serait stupide et inutile.

cependant, si vous avez MongoDB < 2.4.0 vous pouvez utiliser une expression régulière comme ceci:

> db.reg.insert({searchword: "win"})
> db.reg.insert({searchword: "window"})
> db.reg.insert({searchword: "Win"})

> db.reg.find()
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e36dd68c9021e453d13"), "searchword" : "window" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

> db.reg.find({ searchword: /^win$/i })
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

cependant, votre version ne fonctionnait pas car vous n'avez pas besoin des "/"s en utilisant l'opérateur $ regex:

> db.reg.find({ searchword: { $regex: "^win$", $options: '-i' }})
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" }
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" }

veuillez noter que les requêtes insensibles à la casse n'utilisent pas l'index de sorte qu'il pourrait être logique de créer un champ de mots de recherche en minuscules afin que vous puissiez accélérer cette requête.

Go ici pour plus d'info sur RegularExpressions

17
répondu Tyler Brock 2014-12-08 20:59:30

utilisez $ strcasecmp. Le cadre d'agrégation a été introduit en MongoDB 2.2. Vous pouvez utiliser l'opérateur chaîne "$strcasecmp" pour faire une comparaison sensible à la casse entre les chaînes. C'est plus recommandé et plus facile que d'utiliser regex.

voici le document officiel sur l'opérateur de la commande d'agrégation: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp .

0
répondu Jogue Wasin 2017-05-20 05:00:43

pour insensible à la casse DB.utilisateur.find ({"name":{ $regex : new RegExp ("Vi", "i") }})

pour sensible à la casse DB.utilisateur.find ({"name":"Vi"}) ou db.utilisateurs.trouver ({"email":"example@mail.com"})

recherche dans la table d'utilisateur

nom est nom de colonne et " Vi "texte qui sont recherchés

-1
répondu Vikas Kumar 2015-11-20 13:17:06