【发布时间】:2016-12-22 03:09:17
【问题描述】:
我正在运行 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} 也可以工作时)。
【问题讨论】:
-
我只是好奇。尽管不是完全替换,但如果您使用逻辑运算符和
db.my_collection.count({ my_field: { $not: {$type:12 } }})代替它会改变什么,而且我很肯定的这个变体db.my_collection.count({ my_field: { $exists: true}})将使用COUNT_SCAN -
@SagarReddy 好问题,我试过
$exists: true,但它在查询计划器中显示IXSCAN。我不确定你想用$type: 12做什么(你的意思是空类型还是日期类型?) -
对不起
$type: 10。无论如何,我不希望它起作用。它将根据文档进行 IXSCAN。我期待$exists能够工作。