输入
我有一系列这样的文档:
{_id: {d: 1, t: 1}, ...}
{_id: {d: 1, t: 2}, ...}
{_id: {d: 2, t: 1}, ...}
...
问题
我正在尝试使用以下查询选择所有带有
_id
的 _id.d = 2
值:
db.coll.find({_id: {$gte: {d: 2}, $lt: {d: 3}}}, {_id: 1})
(请注意,我不是直接在查询中引用
_id.d
)
但是这个查询似乎没有被覆盖,因为我们有 IXSCAN 作为 FETCH 的后代:
"inputStage" : {
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"_id" : {
"$lt" : {
"d" : 1210
}
}
},
{
"_id" : {
"$gte" : {
"d" : 1209
}
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"_id" : 1
},
"indexName" : "_id_",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"_id" : [
"[{ d: 1209 }, { d: 1210 })"
]
}
}
}
涵盖查询的记录的限制之一是:
• 查询谓词中或投影中返回的任何索引字段都是嵌入文档中的字段。
但是我的查询似乎没有引用嵌入文档中的任何字段,它只说明整个嵌入文档的索引边界。
问题
我的查询是否受到引用限制?在我的案例中是否可以进行涵盖查询?为什么 MongoDB 需要执行 FETCH 来完成这个查询?
我也有同样的问题。尝试使用子文档的单个字段上的主索引键的索引覆盖查询,我无法避免进入 FETCH 阶段。此外,我在匹配阶段之后添加了一个项目阶段,并将这些投影字段添加到索引中,使其成为复合索引,但它仍然需要从集合中获取数据。 文档结构
{
"_id": {
"$oid": "oid"
},
"field1": {
"$numberLong": "5287044338465689952"
},
"field2": {
"$numberLong": "419618312613922613"
},
"field3": {
"$numberLong": "12314123532"
},
"field4": "string",
"subdocument": [
{
"subField1": integer
}
]
}
查询
{ $match: {
{
$and: [
{
"subdocument.subField1": {
$gte: 0,
},
},
{
"subdocument.subField1": {
$lt: 10000,
},
},
],
},
},
{ $projection:
{
"subdocument.subField1": 1,
field1: 1,
field2: 1,
field3: 1,
field4: 1,
_id: 0
},
}
索引
{"subdocument.subField1": 1, field1: 1, field2: 1, field3: 1, field4: 1}
解释一下 返回 906 个文件 审查了 906 份文件 内存中没有排序 检查了 906 个索引键
PROJECTION_DEFAULT -> FETCH -> IXSCAN