MongoDB-索引前缀如何工作?

MongoDB-索引前缀如何工作?,mongodb,indexing,Mongodb,Indexing,我已经阅读了以下文档: 有了这些信息。我试图回答MongoDB模拟测试的问题,他们的问题是 您在things集合上有以下索引: [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.things" }, { "v" : 1, "key" : {

我已经阅读了以下文档:

有了这些信息。我试图回答MongoDB模拟测试的问题,他们的问题是

您在things集合上有以下索引:

    [
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.things"
    },
    {
        "v" : 1,
        "key" : {
            "a" : 1
        },
        "name" : "a_1",
        "ns" : "test.things"
    },
    {
        "v" : 1,
        "key" : {
            "c" : 1,
            "b" : 1,
            "a" : 1
        },
        "name" : "c_1_b_1_a_1",
        "ns" : "test.things"
    }
]

问题: 以下哪项查询需要您将每个文档加载到RAM中才能完成查询?假设在查询过程中没有写入任何数据。勾选所有适用项


db.things.find( { b : 1 } ).sort( { c : 1, a : 1 } )

db.things.find( { c : 1 } ).sort( { a : 1, b : 1 } )

db.things.find( { a : 1 } ).sort( { b : 1, c : 1 } )

他们给出的答案是

db.things.find{b:1}.sort{c:1,a:1}
有人能帮我理解为什么其他2个选项不正确,即它们如何使用索引/索引前缀。我的理解是排序部分必须匹配索引列顺序。此外,建议的正确答案似乎也不符合每个文档的规则。

我认为,考虑到选项和答案,重点是找到:

以下哪项查询需要您将每个文档加载到RAM中才能完成查询

因此,分类是一种危险的做法

find{b:1}无法使用提供的任何索引 find{c:1}可以使用索引c_1_b_1_a_1,因为它与前缀匹配 find{a:1}可以使用索引a_1 由于选项2和3可以使用索引,因此它们不会加载每个文档以对其进行排序,而只加载通过索引找到的文档。选项1必须进行完整的收集扫描,以查找b为1的文档。

如果仍不清楚,请查看并告知我。