web-dev-qa-db-fra.com

Recherche insensible à la casse dans Mongo

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

c'est-à-dire que j'utilise un regex avec les options i. Mais j’ai du mal à restreindre l’expression rationnelle à ce mot, elle fonctionne plutôt comme un «j'aime» dans SQL. 

par exemple, si j'utilise une requête telle que {"SearchWord" : { '$regex' : 'win', $options: '-i' }}, elle affiche les résultats obtenus pour win, window & winter. Comment puis-je le limiter à la victoire?

J'ai essayé /^win$/ mais sa sayin invalide Json .... S'il vous plaît suggérer un moyen.

Merci d'avance

44
Praneeta

Vous pouvez utiliser '$regex':'^win$' ou /^win$/i (ne notez aucune citation sur le second)

Source ici: Regex dans les requêtes avec Mongo

44
AlphaB

Vous pouvez utiliser $options => i pour la recherche sans distinction de casse. Donner quelques exemples possibles requis pour la correspondance de chaîne.

Insensible à la casse exacte string

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

Contient string

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

Commencez par string

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

Terminez par string

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

Ne contient pas 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/

80
Somnath Muluk

UPDATE: à partir de MongoDB 2.4, on utilisait un index "texte" et une requête de recherche en texte intégral pour le faire. Vous pouvez lire à leur sujet ici . Si vous utilisez une MongoDB récente, 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 "/" lorsque vous utilisez 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 ne faisant pas la distinction entre les majuscules et les minuscules n'utilisent pas l'index. Il peut donc être judicieux de créer un champ de mot de recherche en minuscule pour pouvoir accélérer cette requête.

Allez ici pour plus d’informations sur RegularExpressions

18
Tyler Brock

Utilisez $ strcasecmp. Le cadre d'agrégation a été introduit dans MongoDB 2.2. Vous pouvez utiliser l'opérateur de chaîne "$ strcasecmp" pour effectuer une comparaison insensible à 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 commande d'agrégation: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp .

0
Jogue Wasin