sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Evitar que mongodb ignore los caracteres especiales?

La descripción de Tomalak de cómo funciona la indexación de texto es correcta, pero en realidad puede usar un índice de texto para una coincidencia de frase exacta en una frase con un carácter 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" }

Las coincidencias de frases exactas se indican encerrando la frase entre comillas dobles, que deben escaparse en el shell como "\"#text\"" .

Los índices de texto son más grandes que los índices normales, pero si está haciendo muchas coincidencias de frases exactas que no distinguen entre mayúsculas y minúsculas, entonces pueden ser una mejor opción que un índice estándar porque funcionarán mejor. Por ejemplo, en un campo t con un índice { "t" : 1 } , una expresión regular de coincidencia exacta

> db.test.find({ "t" : /#text/ })

realiza un escaneo de índice completo. La consulta de texto análoga (pero no equivalente)

> db.test.find({ "$text" : { "$search" : "\"#text\"" } })

utilizará el índice de texto para localizar documentos que contengan el término "text" , luego escanea todos esos documentos para ver si contienen la frase completa "#text ".

Tenga cuidado porque los índices de texto no distinguen entre mayúsculas y minúsculas. Continuando con el ejemplo anterior:

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