2011-11-23 3 views
27

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

ie J'utilise une regex avec des options i. Mais je ne parviens pas à limiter la regex juste ce mot, ses plus comme un exécute « Comme » dans SQL

par exemple: si j'utilise requête comme {"SearchWord" : { '$regex' : 'win', $options: '-i' }}, il me montre les résultats pour la victoire, la fenêtre & hiver. Comment puis-je le limiter à la victoire de show de jsut?

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

Merci à l'avance

Répondre

17

MISE À JOUR: Au MongoDB 2.4 on utiliserait un "texte" index et requête de recherche de texte intégral pour ce faire. Vous pouvez lire à leur sujet here. 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 parce que vous n'avez pas besoin «/» s quand en utilisant l'opérateur $ regex:

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

S'il vous plaît noter que les requêtes ne respecte pas la casse pas utiliser l'index de sorte qu'il pourrait être judicieux de faire un champ minuscule searchword afin que vous pouvez accélérer ce requête.

Go here pour plus d'informations sur RegularExpressions

+1

$ text ne remplace pas regex. C'est assez restrictif et ne lui permettrait pas de trouver "l'hiver" avec une recherche de "gagner". –

+0

@BT Vous avez raison. Pour ce faire, il faudrait stocker des n-grammes et correspondre à ceux-ci. [Recherche floue avec MongoDB et Python] (https://medium.com/xeneta/fuzzy-search-with-mongodb-and-python-57103928ee5d#.yg7f3428b) – Rohmer

+0

Aussi: [Index insensibles à la casse] (https: // docs .mongodb.com/manual/core/index-case-insensitive /) – Rohmer

-1

Pour insensible à la casse db.users.find ({ "name": {$ regex: new RegExp ("Vi", "i")}})

Pour le cas sensible db.users.find ({ "name": "Vi"}) ou db.users.find ({ "email": "[email protected]"})

recherche dans la table utilisateur

nom est co nom lumn et texte "Vi" recherchés

57

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

cas exacte insensible string

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

Contient string

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

Commencez avec string

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

End avec string

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

ne contient pas string

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

Gardez cela comme un signet, et une référence pour toutes les autres modifications que vous pourriez avoir besoin. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

+0

Par erreur, vous avez mis l'exemple de "Contient chaîne" dans "Chaîne insensible à la casse" et vice-versa. J'ai édité votre réponse en échangeant les exemples pour ces deux cas et également corrigé quelques erreurs grammaticales. – gauravparmar

+0

@gauravparmar: Veuillez vérifier et corriger si quelque chose est incorrect. –

+0

J'ai édité votre réponse, mais elle doit être révisée par des pairs. – gauravparmar