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
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
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 /
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
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 .
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