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

Impedir que o mongodb ignore caracteres especiais?


A descrição de Tomalak de como a indexação de texto funciona está correta, mas você pode usar um índice de texto para uma correspondência exata de frase em uma frase com um caractere especial:
> db.test.drop()
> db.test.insert({ "_id" : 0, "t" : "hey look at all this #text" })
> db.test.insert({ "_id" : 1, "t" : "text is the best" })
> db.test.ensureIndex({ "t" : "text" })

> db.test.count({ "$text" : { "$search" : "text" } })
2
> db.test.count({ "$text" : { "$search" : "#text" } })
2

> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
{ "_id" : 0, "t" : "hey look at all this #text" }

As correspondências exatas de frase são indicadas entre a frase entre aspas duplas, que precisam ser escapadas no shell como "\"#text\"" .

Os índices de texto são maiores que os índices normais, mas se você estiver fazendo muitas correspondências de frase exatas que não diferenciam maiúsculas de minúsculas, eles podem ser uma opção melhor do que um índice padrão, pois terão um desempenho melhor. Por exemplo, em um campo t com um índice { "t" : 1 } , uma regex de correspondência exata
> db.test.find({ "t" : /#text/ })

executa uma verificação completa do índice. A consulta de texto análoga (mas não equivalente)
> db.test.find({ "$text" : { "$search" : "\"#text\"" } })

iráusar o índice de texto para localizar documentos que contenham o termo "text" , digitalize todos esses documentos para ver se eles contêm a frase completa "#text ".

Tenha cuidado porque os índices de texto não diferenciam maiúsculas de minúsculas. Continuando o exemplo acima:
> db.test.insert({ "_id" : 2, "t" : "Never seen so much #TEXT" })

> db.test.find({ "t" : /#text/ })
{ "_id" : 0, "t" : "hey look at all this #text" }

> db.test.find({ "$text" : { "$search" : "\"#text\"" } })
{ "_id" : 0, "t" : "hey look at all this #text" }
{ "_id" : 2, "t" : "Never seen so much #TEXT" }