1

我的索引:

{
        "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})

解释()的输出:

{
        "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" : "您目前不能混合包含和排除字段。如果这是一个问题,请联系我们。"

4

2 回答 2

2

此查询explain显示"indexOnly": true

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

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

于 2013-11-06T18:36:00.443 回答
1

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

于 2014-05-27T02:19:02.660 回答