使用聚合管道的排序阶段的索引与小组阶段中的最后一个或第一个

时间:2017-09-29 15:20:45

标签: mongodb

我注意到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个文档。 真的是第一个和最后一个必然效率低下的情况吗?如果是这样,常见的解决方法是什么?

0 个答案:

没有答案