2011-10-10 199 views
13

En la sintaxis "db.foo.find()" de MongoDB, ¿cómo puedo decir que coincida con todas las letras y sus versiones acentuadas?Mongodb coincide con los caracteres acentuados como carácter subyacente

Por ejemplo, si tengo una lista de nombres en mi base de datos:
João
François
Jesús

¿Cómo iba a permitir una búsqueda de las cuerdas "Joao", "Francois", o " Jesús "para que coincida con el nombre de pila?
espero que no tengo que hacer una búsqueda como esto cada vez:
db.names.find({name : /Fr[aã...][nñ][cç][all accented o characters][all accented i characters]s/ })

Respuesta

9

A partir de Mongo 3.2, puede utilizar $text y establecer $diacriticSensitive false:

{ 
    $text: 
    { 
     $search: <string>, 
     $language: <string>, 
     $caseSensitive: <boolean>, 
     $diacriticSensitive: <boolean> 
    } 
} 

Ver más en la documentación Mongo: https://docs.mongodb.com/manual/reference/operator/query/text/

+3

Creo que esto gana la mejor respuesta, 5 años después, para una función que no existía cuando hice la pregunta. Ya no estoy trabajando en el proyecto relevante, pero confiaré en que esto hace lo que quería. – Josh

0

Parece más como búsqueda de coincidencia aproximada, que MongoDB no soporta actualmente. Lo que puedes probar es:

/1. Almacene variaciones del nombre en un elemento separado en la colección para cada entrada. Luego, la consulta se puede ejecutar buscando si el término de búsqueda existe dentro de la matriz de variaciones.

o

/2. Almacene soundex cadena para cada uno de los nombres en la misma colección. Luego, para su cadena de búsqueda, obtenga una cadena soundex y consulte la base de datos, obtendrá un resultado que tiene un resultado similar al Soundex a su consulta. Puede filtrar y verificar esos datos más en su secuencia de comandos. ejemplo:

Código Soundex para François = F652, Código Soundex para Francois = F652

Código Soundex para Jesús = J220, Código Soundex para Jesús = J220

Consulte más aquí: http://creativyst.com/Doc/Articles/SoundEx1/SoundEx1.htm#SoundExConverter

+0

variaciones no funcionarán, porque si tengo un nombre con acentos múltiples No quiero tener que almacenar cada permutación de caracteres acentuados y no acentuados. Soundex parece interesante. Pero ninguno hace exactamente lo que quiero. Esperaba un "tratar los personajes acentuados como su personaje base" bandera mágica de la expresión regular o algo así ... Si esto no existe, entonces creo que tendré que modificar la expresión regular mediante programación antes de que llegue a mongo. – Josh

+0

Puede encontrar una solución aquí: http://stackoverflow.com/questions/1890854/how-to-replace-special-characters-with-the-ones-theyre-based-on-php – DhruvPathak

8

Sugiero que agregue un campo indexado como NameSearchable de cadenas simplificadas, p. Ej.

  • João -> JOAO
  • François -> François
  • Jesús -> JESÚS
  • Jürgen -> Juergen

La misma correlación que se utiliza para insertar nuevos elementos en la base de datos se puede usar al buscar. Se conservará la cuerda original con la carcasa y los acentos correctos.

Lo que es más importante, la consulta puede hacer uso de la indexación. Las consultas que no distinguen entre mayúsculas y minúsculas y las expresiones regulares no pueden usar los índices (a excepción de las expresiones regulares rooteadas) y crecerán prohibitivamente lentas en colecciones grandes.

Ah, y como las cadenas simplificadas se pueden crear a partir de las cadenas originales, no es un problema agregar esto a colecciones existentes.

+0

Estas sugerencias son muchas. de sentido ¿Tienes algún fragmento que lo soporte? – elhoyos

+1

Desafortunadamente depende del lenguaje de programación. http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net explica una serie de formas de hacerlo en C#, http: // stackoverflow. com/questions/990904/javascript-remove-accents-diacritics-in-strings contiene fragmentos de JavaScript (pero el enfoque es diferente) – mnemosyn

+1

Hice una implementación simple de esto para los usuarios de Node: https://github.com/weisjohn/mongoose -latinize – weisjohn

Cuestiones relacionadas