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
Vous pouvez utiliser '$regex':'^win$'
ou /^win$/i
(ne notez aucune citation sur le second)
Source ici: Regex dans les requêtes avec Mongo
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/
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
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 .