2011-11-23 24 views
27

Estoy usando una búsqueda insensible a mayúsculas/minúsculas en Mongo, algo similar a https://stackoverflow.com/q/5500823/1028488.Búsqueda insensible a mayúsculas o minúsculas en Mongo

es decir, estoy usando una expresión regular con opciones i. Pero estoy estoy teniendo problemas para restringir la expresión regular a solo esa palabra, sus realiza más como un 'Me gusta' en SQL

por ejemplo: si uso consulta como {"SearchWord" : { '$regex' : 'win', $options: '-i' }}, me muestra los resultados para ganar, & ventana de invierno. ¿Cómo lo restrinjo a jsut show win?

Probé /^win$/ pero dice que no es válido Json .... Sugiera un modo.

Gracias de antemano

Respuesta

17

ACTUALIZACIÓN: A partir de MongoDB 2.4 se podría usar una índice de "texto" y consulta de búsqueda de texto completo para hacer esto. Puede leer sobre ellos here. Si utiliza un MongoDB reciente, el siguiente enfoque sería tonto e innecesario.

Sin embargo, si usted tiene MongoDB < 2.4.0 se puede utilizar una expresión regular de este modo:

> 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" } 

Sin embargo, su versión no estaba funcionando debido a que no es necesario el s "/" cuando usando el operador de expresión regular $:

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

Tenga en cuenta que el caso consultas insensibles no utilizan el índice de modo que podría tener sentido para hacer un campo de palabra de búsqueda en minúsculas para que pueda acelerar hasta esa consulta.

Ir here para obtener más información sobre RegularExpressions

+1

$ text no reemplaza a regex. Es bastante restrictivo y no le permitiría encontrar el "invierno" con una búsqueda de "ganar". –

+0

@BT Tienes razón. Para hacer eso uno tendría que almacenar n-grams y combinar en esos. [Búsqueda difusa con MongoDB y Python] (https://medium.com/xeneta/fuzzy-search-with-mongodb-and-python-57103928ee5d#.yg7f3428b) – Rohmer

+0

También: [Índices insensibles a mayúsculas y minúsculas] (https: // docs .mongodb.com/manual/core/index-case-insensitive /) – Rohmer

-1

Para el caso insensible db.users.find ({ "name": {$ regex: new RegExp ("Vi", "i")}})

Para el caso sensibles db.users.find ({ "name": "Vi"}) o db.users.find ({ "e-mail": "[email protected]"})

búsqueda en la tabla de usuario

name is co nombre de lumn y texto "Vi" que se buscan

57

Puede usar $options => i para buscar mayúsculas y minúsculas. Dando algunos posibles ejemplos necesarios para la coincidencia de cadenas.

caso exacto insensibles string

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

Contiene string

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

de inicio con string

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

final con string

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

¿No Contiene string

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

Mantener esto como señal, y una referencia para cualquier otra alteración que pueda necesitar. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

+0

Por error, ha puesto el ejemplo de "Contiene cadena" dentro de "Cadena insensible a mayúsculas y minúsculas" y viceversa. He editado tu respuesta intercambiando los ejemplos de esos dos casos y también corregido algunos errores gramaticales. – gauravparmar

+0

@gauravparmar: verifique y corrija si algo es incorrecto. –

+0

He editado su respuesta, pero tiene que ser revisada por colegas, dice. – gauravparmar

Cuestiones relacionadas