mongodb - 为什么 Mongo FETCH 在 count() 上使用 $nin?
问题描述
我试图理解为什么 Mongo 不能在我的查询中使用覆盖索引$nin
,以及如何解决它。我的问题是复合索引,但它也发生在简单索引上。
拿一个简单的文件:
{b: "text1"}
还有一个简单的索引:
{
"v" : 1,
"key" : {
"b" : 1
},
"name" : "b_1",
"ns" : "mytest"
}
我认为是一个简单的count()
查询:
db.mytest.count( {b: $nin: [ "foo" ]}, {b:1, _id:0} )
winningPlan
意外地包括一个FETCH
:
"winningPlan" : {
"stage" : "COUNT",
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"b" : 1
},
"indexName" : "b_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"b" : [
"[MinKey, \"foo\")",
"(\"foo\", MaxKey]"
]
}
}
}
}
但是它使用了一个简单的相等条件COUNT_SCAN
(如预期的那样):
> db.mytest.count( {b: "bar" }, {b:1, _id:0} )
"winningPlan" : {
"stage" : "COUNT",
"inputStage" : {
"stage" : "COUNT_SCAN",
"keyPattern" : {
"b" : 1
},
"indexName" : "b_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1
}
},
为了让事情更有趣,afind()
而不是 acount()
不查看任何文档:
> db.mytest.find({b:{ $nin: [ 3 ] }}, {b:1, _id:0})
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {
"b" : 1,
"_id" : 0
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"b" : 1
},
"indexName" : "b_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"b" : [
"[MinKey, 3.0)",
"(3.0, MaxKey]"
]
}
}
}
为什么 Mongo 需要FETCH
with $nin
?它应该能够仅从索引中实现这一点。
解决方案
所以看起来这是一个在 3.6 中修复的错误。在许多 COUNT 情况下肯定存在不必要的 FETCH。
推荐阅读
- .net - 如何强制 Visual Studio 项目安装程序完成设置?
- sapui5 - 使用什么 sapui5 控件来构建以下界面?
- java - 如何在另一个字符串中找到一个字符串
- c++ - 无法正确输出,需要在不同的行上使用相同的代码
- java - error: cannot access InternalTokenProvider (Firebase/GooglePlayServices)
- python - 如何根据价值划分熊猫系列?
- jquery - 获取变量形式部分类选择器jQuery
- docker - 生产关键数据和非生产非关键数据应存储在哪里?
- html - Bootstrap4 导航栏折叠按钮没有响应
- c++ - 将成员函数作为参数传递给优化器(将成员函数传递给函数)