Regex MongoDB,正则表达式在索引字段上的查询性能

Regex MongoDB,正则表达式在索引字段上的查询性能,regex,mongodb,indexing,mongodb-query,Regex,Mongodb,Indexing,Mongodb Query,我想按名称查找一个帐户(在包含5万个帐户的MongoDB集合中) 以通常的方式:我们使用字符串查找 db.accounts.find({ name: 'Jon Skeet' }) // indexes help improve performance! 使用正则表达式怎么样?这是一项昂贵的手术吗? db.accounts.find( { name: /Jon Skeet/ }) // worry! how indexes work with regex? 编辑: 根据WiredPairi

我想按名称查找一个帐户(在包含5万个帐户的MongoDB集合中)

以通常的方式:我们使用字符串查找

db.accounts.find({ name: 'Jon Skeet' })  // indexes help improve performance!
使用正则表达式怎么样?这是一项昂贵的手术吗?

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

编辑:

根据WiredPairie:
MongoDB使用正则表达式的前缀来查找索引(例如:
/^prefix.*/
):


实际上根据文件

如果字段存在索引,则MongoDB与常规 相对于索引中的值的表达式,它可以比 收集扫描。如果规则的 表达式是一个“前缀表达式”,这意味着所有潜在的 匹配项以相同的字符串开头。这允许MongoDB构造一个 该前缀的“范围”,并且仅与 在该范围内的索引

换言之:

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


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

@dirkk,我想获得更多经验和解释。我还想和大家分享这个问题。要让regex使用索引,它必须使用文档中所示的锚定:可能重复StackOverflow上已经回答了许多其他非常类似的问题。@WiredPairie我想关注的是性能,而不是如何进行查询。如果存在即时匹配,regex可以正常工作(即:匹配字母
a
)。但如果匹配一个完整的单词,结果需要更长的时间(即:
angular
)这是跨越6M的文件,无论如何还是要加快这些查询的速度吗?他们在19-30秒的时间内可以得到8个字符,但是立即返回1-2个字符。@ CouWy,我相信MangGDB不是在文本中间搜索字符串出现的最佳工具。我建议看弹性搜索或任何其他全文搜索。h发动机。
db.accounts.find( { name: /^Jon Skeet/ })  // indexes will help!'