mongodb - 使用索引计算非空字段

时间:2017-11-14 01:23:18

标签: mongodb indexing count null undefined

我回答了我自己的问题,希望它可以帮助别人。我正在使用mongodb(3.4),在索引字符串字段上运行count(),在10m文档的集合中。我正在寻找非空字符串。以下是一些性能指标,其中slow == collection_scan和fast == index_scan:

+----------------+-----------+
|   Constraint   |Performance|
+----------------+-----------+
| $exists(false) |   slow    |
| $exists(true)  |   slow    |
| $ne: ''        |   slow    |
| $eq: ''        |   fast    |
| $eq: null      |   slow    |
+----------------+-----------+

我认为我基本上了解发生的事情,即:

1。 $存在(假)

不存在的字段不会进入索引,因此mongodb必须执行收集扫描才能收集count()所有文档。

2。 $存在(真)

这是让我的。我觉得它会很快,但我错了。我认为这是因为如果一个字段存在,并且它的值设置为undefined,则$ exists()返回 true 。我只能假设设置为undefined的字段也不输入索引,因此mongodb必须再次执行集合扫描以收集count()的所有文档。

第3。 $ ne:''

我猜它与$ exists(false)相同

4。 $ eq:''

这是一个真正的字符串值,因此它必须存在于索引中,因此速度很快。

4。 $ eq:null

这是另一个让我受益的人。本文档有助于批次https://jira.mongodb.org/browse/SERVER-18653)。简而言之,2.6版本(https://docs.mongodb.com/manual/release-notes/2.6-compatibility/#null-comparison-queries):

  

空等式查询(即field:null)现在匹配值为undefined

的字段

此查询很慢。我只能假设未定义的字段没有被索引,并且因为null匹配两者,mongodb必须再次执行集合扫描以收集count()的所有文档。

那么,做什么?

1 个答案:

答案 0 :(得分:0)

<强>解决方案

我最终做的是使用正则表达式/^.+$/来查找非空字符串。这使用索引并且速度超快。同样重要的是,我现在尽量避免使用$exists()$ne:

由于