MongoDB aggregate聚合功能,可能很多人比较熟悉了,除了常用的功能,个人觉得其中的几个Accumulators的功能非常不错。

Accumulators有$sum,$avg,$first,$last,$max,$min,$push,$addToSet,其中$sum求和功能类似sql group by的count,比较常用。这里说下$first$last功能非常实用,相当于oracle里的 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...),方便取分组排序再取其中一个值。如:

{ "_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分组,取最近的一个日期。

db.sales.aggregate(
   [
     { $sort: { item: 1, date: 1 } },
     {
       $group:
         {
           _id: "$item",
           lastSalesDate: { $last: "$date" }
         }
     }
   ]
)

结果:

{ "_id" : "xyz", "lastSalesDate" : ISODate("2014-02-15T14:12:12Z") }
{ "_id" : "jkl", "lastSalesDate" : ISODate("2014-02-03T09:00:00Z") }
{ "_id" : "abc", "lastSalesDate" : ISODate("2014-02-15T08:00:00Z") }

参考:
http://docs.mongodb.org/manual/reference/operator/aggregation/last/


ccj 于 2015-10-03 22:22 修改
0 回复
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。