我已阅读此文档:“ Sort and Non-prefix Subset of an Index”
有关该信息。我正在尝试回答这个MongoDB模拟测试问题,他们的问题是
您对事物集合具有以下索引:
[
{
"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个选项不正确,即他们如何使用索引/索引前缀。我的理解是SORT部分必须匹配索引列顺序。另外,建议的正确答案似乎也不符合规则(根据文档)。
答案 0 :(得分:1)
我相信,鉴于选择和答案,重点在于找到:
以下哪些查询要求您将每个文档加载到RAM中,以完成查询?
所以排序是一条红鲱鱼。
find({ b: 1 })
不能使用提供的任何索引find({ c: 1 })
可以使用索引c_1_b_1_a_1
,因为它与前缀匹配find({ a: 1 })
可以使用索引a_1
由于选项#2和#3可以使用索引,因此它们将不会加载每个来对它们进行排序,只是通过索引找到的那些。选项#1必须进行一次完整的集合扫描,才能找到b
为1
的文档。