阻止mongodb忽略特殊字符?

时间:2015-02-07 08:39:34

标签: mongodb

Model.find({ $text : {$search: "#text"} })

返回包含“text”的所有内容,而不仅仅是那些带有“#text”的文档。我试过在#之前放一个\,但没有用。如何阻止mongodb忽略我的特殊字符?谢谢。

1 个答案:

答案 0 :(得分:3)

Tomalak关于文本索引如何工作的描述是正确的,但实际上您可以对具有特殊字符的短语使用exact phrase match的文本索引:

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

确切的词组匹配是用双引号括起来表示的,需要在shell中转义,如"\"#text\""

文本索引比普通索引大,但如果你做了很多不区分大小写的精确短语匹配,那么它们可能比标准索引更好,因为它们会表现更好。例如,在索引为t的字段{ "t" : 1 }上,精确匹配正则表达式

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

执行完整索引扫描。类似的(但不是等效的)文本查询

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

将使用文本索引查找包含术语"text"的文档,然后扫描所有这些文档以查看它们是否包含完整的短语"#text“。

要小心,因为文本索引不区分大小写。继续上面的例子:

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