在进行通配符,不区分大小写,正则表达式搜索时,mongo是否使用索引?

时间:2015-04-16 16:12:25

标签: mongodb

我已经看过一些关于它没有的讨论,但其中一些讨论已经有几年了。

我基本上试图弄清楚允许我的用户输入姓氏的一部分并查找匹配名称的数据库成本,无论数据库中的名称是什么情况,还是有效地使用通配符查询字词的前面和后面。 因此,对ers的查询应返回如下名称:

  • Ers
  • ERS ​​
  • ERSO
  • 的Anders
  • 安德森

我是否正确地解释了这个解释,因为它肯定是在lastName上使用我的索引?

db.chart.find({"lastName": /ers/i}).explain()
{
"cursor" : "BtreeCursor lastName_1",
"isMultiKey" : false,
"n" : 1246,
"nscannedObjects" : 1246,
"nscanned" : 56467,
"nscannedObjectsAllPlans" : 1246,
"nscannedAllPlans" : 56467,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 441,
"nChunkSkips" : 0,
"millis" : 55,
"indexBounds" : {
    "lastName" : [
        [
            "",
            {

            }
        ],
        [
            /ers/i,
            /ers/i
        ]
    ]
},
"server" : "servername:27017",
"filterSet" : false

}

另外,我的索引是"升序"而不是"文字"

我遇到的一些建议也表明我存储了我想要搜索的字段的UPPERCASED版本以实现不区分大小写的搜索结果,但正如上面的解释所示,似乎mongo现在能够使用索引进行通配符和不区分大小写的搜索...因此,似乎不再需要存储大写数据。

只是在寻找其他人的想法。

感谢。

1 个答案:

答案 0 :(得分:1)

为了让MongoDB在不区分大小写的搜索中使用索引,请使用$text,因为您需要创建text index

db.chart.find({$text: {"lastName": /ers/i}})

如果您有一个字段索引,MongoDB不会在不区分大小写的搜索中使用此索引。

请参阅未解决的问题:SERVER-90