我注意到MongoDB正在进行集合扫描,即使我使用索引进行排序,也会在聚合管道的组阶段中进行上一次或第一次。 假设我想获得匹配文档的所有字段 - 我是否必须有一个包含所有字段的索引才能避免收集扫描?
以下是我的示例数据:
{ "_id" : 1, "item" : "abc", "date" : ISODate("2014-01-01T08:00:00Z"), "price" : 10, "quantity" : 2 }
{ "_id" : 2, "item" : "jkl", "date" : ISODate("2014-02-03T09:00:00Z"), "price" : 20, "quantity" : 1 }
{ "_id" : 3, "item" : "xyz", "date" : ISODate("2014-02-03T09:05:00Z"), "price" : 5, "quantity" : 5 }
{ "_id" : 4, "item" : "abc", "date" : ISODate("2014-02-15T08:00:00Z"), "price" : 10, "quantity" : 10 }
{ "_id" : 5, "item" : "xyz", "date" : ISODate("2014-02-15T09:05:00Z"), "price" : 5, "quantity" : 10 }
{ "_id" : 6, "item" : "xyz", "date" : ISODate("2014-02-15T12:05:10Z"), "price" : 5, "quantity" : 5 }
{ "_id" : 7, "item" : "xyz", "date" : ISODate("2014-02-15T14:12:12Z"), "price" : 5, "quantity" : 10 }
使用此索引:
{item : 1, date : 1}
这个查询:
db.sales.aggregate(
[
{ $sort: { item: 1, date: 1 } },
{
$group:
{
_id: "$item",
lastSalesDate: { $last: "$date" }
}
}
]
)
我们发现检查了7个密钥,检查了0个文档。但是,如果我们使用相同的索引运行以下查询:
db.sales.aggregate(
[
{ $sort: { item: 1, date: 1 } },
{
$group:
{
_id: "$item",
lastSalesDate: { $last: "$date" },
lastPrice: {$last: "$price"}
}
}
]
)
并查看分析器输出,我们发现检查了7个密钥,并检查了7个文档。 真的是第一个和最后一个必然效率低下的情况吗?如果是这样,常见的解决方法是什么?