集合sales的定義如下:
{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") } { "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") } { "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") } { "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-04T11:21:39.736Z") } { "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04-04T21:23:13.331Z") }
聚合函數如下:
db.sales.aggregate( [ { $group : { _id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } }, totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } }, averageQuantity: { $avg: "$quantity" }, count: { $sum: 1 } } } ] )
{ "_id" : { "month" : 3, "day" : 15, "year" : 2014 }, "totalPrice" : 50, "averageQuantity" : 10, "count" : 1 } { "_id" : { "month" : 4, "day" : 4, "year" : 2014 }, "totalPrice" : 200, "averageQuantity" : 15, "count" : 2 } { "_id" : { "month" : 3, "day" : 1, "year" : 2014 }, "totalPrice" : 40, "averageQuantity" : 1.5, "count" : 2 }
或者在mongochef中的json view如下:
{ "_id" : { "month" : NumberInt(4), "day" : NumberInt(4), "year" : NumberInt(2014) }, "totalPrice" : 200.0, "averageQuantity" : 15.0, "count" : NumberInt(2) } { "_id" : { "month" : NumberInt(3), "day" : NumberInt(15), "year" : NumberInt(2014) }, "totalPrice" : 50.0, "averageQuantity" : 10.0, "count" : NumberInt(1) } { "_id" : { "month" : NumberInt(3), "day" : NumberInt(1), "year" : NumberInt(2014) }, "totalPrice" : 40.0, "averageQuantity" : 1.5, "count" : NumberInt(2) }
實例說明:
1、
_id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } },
此處指定的“_id” 必需且唯一,意為根據所列的域(字段)進行分組。
如果指定: _id : null
則意為對所有行進行分組統計,
例子如下:
db.sales.aggregate(
[
{
$group : {
_id : null,
totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
)
查詢結果如下:
{ "_id" : null, "totalPrice" : 290, "averageQuantity" : 8.6, "count" : 5 }
2、
$sum:1
表示每條記錄按照數量1計數,
如果設為2,則每條記錄(文檔、每行)按照數量2計數,然后 總數=計數*行數(記錄數*每條記錄的計數)。
3、
$month: "$date"
根據日期字段取該日期對應的月份。