MongoDB:包含子文档索引的查询

问题描述 投票:0回答:1

输入

我有一系列这样的文档:

{_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 来完成这个查询?

mongodb nosql
1个回答
0
投票

我也有同样的问题。尝试使用子文档的单个字段上的主索引键的索引覆盖查询,我无法避免进入 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

© www.soinside.com 2019 - 2024. All rights reserved.