MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

A pesquisa diacriticInSensitive do MongoDB não mostra todas as linhas acentuadas (palavras com marca diacrítica) conforme o esperado e vice-versa


Desde o mongodb 3.2 , índices de texto são diacríticos insensíveis:

Com a versão 3, o índice de texto é insensível a diacríticos. Ou seja, o índice não distingue entre caracteres que contêm sinais diacríticos e seus correspondentes não marcados, como é, ê e e. Mais especificamente, o índice de texto retira os caracteres categorizados como diacríticos na Lista de props do banco de dados de caracteres Unicode 8.0.

Portanto, a seguinte consulta deve funcionar:
db.Collection.find( { $text: { $search: "iphone"} } );
db.Collection.find( { name: { $regex: "iphone"} } );

mas parece que há um bug com trema ( ¨ ), mesmo que seja classificado como diacrítico na lista unicode 8.0 (problema no JIRA:SERVER-29918 )

Solução


desde o mongodb 3.4 você pode usar o agrupamento que permite realizar esse tipo de consulta:

por exemplo, para obter a saída esperada, execute a seguinte consulta:
db.Collection.find({name: "iphone"}).collation({locale: "en", strength: 1})

isso irá produzir:
{ "_id" : 1, "name" : "iphone" }
{ "_id" : 2, "name" : "iphône" }
{ "_id" : 3, "name" : "iphonë" }
{ "_id" : 4, "name" : "iphônë" }

no agrupamento, strength é o nível de comparação para realizar
  • 1 :apenas caractere base
  • 2 :sensível ao diacrítico
  • 3 :diferencia maiúsculas de minúsculas + diferencia diacríticos