不包括使用$ ne查询的mongo count操作

时间:2016-12-22 03:09:17

标签: mongodb indexing

我正在运行mongo 3.2.11(WiredTiger)。我有一个包含ISODates的字段的集合,我注意到这种形式的查询之间存在显着差异:

db.my_collection.count({ my_field: { $ne: null } })

以及此表格:

db.my_collection.count({ my_field: { $gt: ISODate('2010-01-01') } })

当我运行解释时,我看到第一种类型的查询产生IXSCAN阶段,第二种类型产生COUNT_SCAN阶段。我的猜测是COUNT_SCAN查询被覆盖(因此他们不需要从磁盘中获取文档),而IXSCAN查询需要从磁盘中提取数据。

如果我的理解是正确的,那么是否有人知道为什么不能涵盖{$ne: null}?我想了解规则以及它是否可能会发生变化,因为我一直使用{$ne: null}(当某些更具体但更不优雅的IMO(如{$gt: some_really_early_date})也能正常工作时。

3 个答案:

答案 0 :(得分:0)

不等式运算符$ ne不是很有选择性,因为它经常匹配索引的大部分。因此,在许多情况下,带有索引的$ ne查询可能不会比必须扫描集合中所有文档的$ ne查询执行得更好。

答案 1 :(得分:0)

$in类似的问题(参见示例)。您可以找到functx

示例(使用IXSCAN代替COUNT_SCAN):

collection.count({
  thing: {
    $in: [ // for a single entry it uses COUNT_SCAN
      ObjectId('54e1b392cf53590c4f3dd77c'),
      ObjectId('557ff02b83f641960fef49da')
    ]
  }
})

答案 2 :(得分:0)

简单的答案是:它是一个mongodb bug! 请参阅2015年创建的以下JIRA问题,但积压日期仍未解决:https://jira.mongodb.org/browse/SERVER-18861

您可以投票支持最终修复。