1.count
count是最简单的聚合工具,用于返回集合中的文档数量,与SQL中的count()一样
如一个空集合插入2条数据
>db.bitest.insert({"memid": "c001"})
>db.bitest.insert({"memid": "c002"})
统计文档数量
>db.bitest.count()
count可以添加条件
>db.bitest.count({"memid":"c001"})
db.getCollection('bittest').explain("executionStats").count({"memid":"c001"})
2.distinct
用法也同SQL的distinct相同,用来找出给定键的所有不同的值,使用时必须指定集合和键
格式如下:
>db.runCommand({distinct: "collection",key:"keyname"})
如果一个sorder集合有5笔订单记录
{"memid": "c001", "sorderno": "a001", "price":20}
{"memid": "c002", "sorderno": "a002", "price":80}
{"memid": "c001", "sorderno": "a003", "price":60}
{"memid": "c003", "sorderno": "a004", "price":30}
{"memid": "c001", "sorderno": "a005", "price":80}
想要统计出有几个下单账号,需要对memid使用distinct
>db.runCommamd({"distinct": "sorder", "key": "memid"})
{"values":["c001","c002","c003"],"ok":1}
3.group
使用group可以进行更复杂的聚合,用法同SQL的Group by
格式如下:
{
group:
{
ns: <namespace>,
key: <key>,
$reduce: <reduce function>,
$keyf: <key function>,
cond: <query>
}
}
-ns : 指定要进行分组的集合
-key:指定文档分组依据的键
-“$Reduce” 这个函数在集合内的每个文档上执行,该函数接受两个参数:当前文档和累加器文档
-keys :可选,替代key字段,指定一个函数创建一个key作为分组的键
-cond:过滤条件
有如下集合:
{"_id" : ObjectId("45de56y678j9i7880f"), "sorderno": "s01", "date": ISODate("2018-01-04T16:00:00Z"), "orderamount": "50"}
{"_id" : ObjectId("346hy8790ju678tt56"), "sorderno": "s02", "date": ISODate("2018-01-04T16:00:00Z"), "orderamount": "80"}
{"_id" : ObjectId("566hy8790ju658ft56"), "sorderno": "s03", "date": ISODate("2018-01-05T16:00:00Z"), "orderamount": "80"}
{"_id" : ObjectId("576hy8790j8i78ui56"), "sorderno": "s04", "date": ISODate("2018-01-05T16:00:00Z"), "orderamount": "80"}
{"_id" : ObjectId("786h48790ju898yt56"), "sorderno": "s05", "date": ISODate("2018-01-06T16:00:00Z"), "orderamount": "80"}
对日期进行分组,统计每天的订单金额
>db.sorder.group({
key: { date:1},
initial : {"totalamount":0},
reduce : function Reduce(doc, out) {
out.totalamount+=doc.orderamount
} });
[
{
"date": ISODate("2018-01-04T16:00:00Z"),
"totalamount": 130
},
{
"date": ISODate("2018-01-05T16:00:00Z"),
"totalamount": 160
},
{ "date": ISODate("2018-01-06T16:00:00Z"),
"totalamount": 80
},
]