【问题标题】:Trouble creating covered query with compound index使用复合索引创建覆盖查询时遇到问题
【发布时间】:2023-03-25 00:35:01
【问题描述】:

我的索引:

{
        "v" : 1,
        "key" : {
                "a" : 1,
                "b" : 1,
                "c" : 1
        },
        "ns" : "Pepper.test",
        "name" : "a_1_b_1_c_1"
}

样本记录:

{ "_id" : ObjectId("527a8477a868a04479a56a56"), "a" : 1, "b" : 1, "c" : 1, "x" : -1 }

我的查询:

db.test.find({a: 1, b: 1, c: 1},{_id: 0, x:0})

explain() 的输出:

{
        "cursor" : "BtreeCursor a_1_b_1_c_1",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "a" : [
                        [
                                1,
                                1
                        ]
                ],
                "b" : [
                        [
                                1,
                                1
                        ]
                ],
                "c" : [
                        [
                                1,
                                1
                        ]
                ]
        },
        "server" : "ip-x-x-x-x:27017"
}

从文档看来,这样的测试应该在说明中将“indexOnly”报告为 true,但事实并非如此。我做错了什么,还是误解了涵盖查询的限制?这个数据集只是一个展示问题的样本,但它与我的真实数据和索引的基本结构相同。

做一个测试,如果我从我的数据中完全删除 x 字段,并指定包含 a、b、c 并排除 _id 它可以工作。如果您的数据集中有任何不属于索引的字段,我似乎无法进行覆盖索引。我尝试包含 a、b、c,并排除 _id 和 x,但 mongo 提供了一个错误说明:

"$err" : "您目前不能混合包含和排除字段。 如果这是一个问题,请联系我们。”

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    如果您已经选择排除“_id”,则不能选择排除任何其他内容。

    【讨论】:

      【解决方案2】:

      此查询的explain 显示"indexOnly": true

      db.test.find({a: 1, b: 1, c: 1}, {_id: 0, a: 1, b: 1, c: 1})
      

      正如@Sammaye 在 cmets 中提到的那样,您的投影需要指定完整的 包含 字段集,因为仅排除 知道不在索引中的字段'这并不意味着您的集合中没有某些文档与索引中没有的其他字段。

      【讨论】:

      • 有趣,所以通过强制包含a、b和c,它会自动排除x?你是对的,这似乎有效并显示“indexOnly”:true
      • @TomSwifty 对。明确包含一个字段后,除 _id 之外的所有其他字段都将被排除。
      • 我可以说为什么OP问题中的查询不起作用,省略了两个字段,MongoDB仍然无法知道索引是否被覆盖而不查看文档
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2014-10-25
      相关资源
      最近更新 更多