我正在运行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}
)也能正常工作时。
答案 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
您可以投票支持最终修复。