MongoDB,通过索引字段上的正则表达式进行查询的性能

时间:2013-07-06 10:00:50

标签: regex mongodb indexing mongodb-query

我希望按名称查找帐户(在50个帐户的MongoDB集合中)

以通常的方式:我们找到了字符串

db.accounts.find({ name: 'Jon Skeet' })  // indexes help improve performance!

正则表达式怎么样?这是一项昂贵的操作吗?

db.accounts.find( { name: /Jon Skeet/ }) // worry! how indexes work with regex?

编辑:

根据WiredPrairie:
MongoDB使用RegEx的前缀来查找索引(例如:/^prefix.*/):

db.accounts.find( { name: /^Jon Skeet/ })  // indexes will help!'

MongoDB $regex

1 个答案:

答案 0 :(得分:28)

实际上根据文档,

  

如果该字段存在索引,则MongoDB与常规索引匹配   表达式对索引中的值,可以比a快   收集扫描。如果常规可以进一步优化   表达式是一个“前缀表达式”,这意味着所有潜力   匹配以相同的字符串开头。这允许MongoDB构建一个   来自该前缀的“范围”仅与来自该前缀的那些值匹配   指数落在该范围内。

http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

换句话说:

对于/ Jon Skeet / regex,mongo将全面扫描索引中的键,然后将获取匹配的文档,这可能比收集扫描更快。

对于/ ^ Jon Skeet / regex,mongo将仅扫描以索引中的正则表达式开头的范围,这将更快。