MongoDB aggregate聚合语法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuxiaoxiaosmile/article/details/79666391

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,

下一个管道接收到的字段来源上一个管道。

语法示例:
db.school.aggregate(
[
{$match:{time:{$gt:1513612800}}},
{$group:{_id:{insituteName:"$institute",class:"$name"},count:{$sum:1}}},
{$sort:{count:-1}},
{$limit:10}]
)
注:

1. $match 表示查询条件

2. $group 表示分组,_id固定写法,

   如果按照多个字段分组,则字段必须都在_id对象中,可以取别名,例如上面示例,输出结果为:
   { "_id" : { "insituteName" : "数学系",class: "一班"}, "count" : 200 }
   { "_id" : { "insituteName" : "英语系",class: "二班" }, "count" : 201 } 
   如果按照一个字段分组,则可以写为{$group:{_id:"$institute",count:{$sum:1}}},此时,查询结果为:
   { "_id" : "数学系", "count" : 1000 }
   { "_id" : "英语系", "count" : 800 }

   若没有分组字段,则{$group:{_id:null,count:{$sum:1}}}

3. $sort 排序,1——正序,-1——倒序

4. $limit 限制输出数据条数

5. count:{$sum:1},1表示统计查询结果数量,如果想统计time字段和则使用 count:{$sum:"$time"}。

    聚合函数有:min,max,sum,avg

6. $project 表示选择显示的字段,1——显示,0——不显示,如下示例:

db.school.aggregate([{$project:{insituteName:1,"time:1,_id:0}},{$match:{"time:{$gt:1513612800}}},{$sort:{"time:-1}},{$limit:10}])

输出:

   { "insituteName" : "数学系", "time" : 1521392371 }

   { "name" : "英语系", "time" : 1521392370 }

7. $skip在跳过指定数量的文档,并返回余下的文档,例如,下面跳过前5条文档,显示第6到第10条:

db.school.aggregate([{$project:{time:1,name:1,_id:0}},{$match:{time:{$gt:1513612800}}},{$group:{_id:{className:"$name"},count:{$sum:1}}},{$sort:{count:-1}},{$limit:10},{$skip:5}]

注释:
$project先筛选出所有文档的time和name两个字段,
$match然后筛选出时间大于1513612800的文档,
$group按照name字段分组,重命名为className,
$sum统计服务条件的文档数量,
$sort按照数量count字段倒序排序,
$limit限制输出10条文档,
$skip跳过前5条文档,输出第6到第7条文档。

复杂示例1:
db.page_status_projects.aggregate([{$match:{clock:{$gt:1513612800},status:{$nin:[200,401,403]}}},{$group:{_id:"$name",count:{$sum:1}}},{$project:{count:1,stopTime:{"$multiply":['$count',5/60]}}},{$sort:{count:-1}}])
注释:
$match筛选出时间大于1513612800,status不等于200,401,403的文档;
$group以name字段分组,并统计各分组文档数量count;
$project输出结果显示count和stopTime字段,其中stopTime为自定义字段,stopTime字段=count * (5 / 60);   
$sort输出结果以count倒序排序
关键字:$multiply,$divide,$gte,$gt,$eq,$add,$lt,$lte,$subtract,$sum等等,运算关键字参照官网:
https://docs.mongodb.com/manual/reference/operator/aggregation/

复杂示例2:
db.page_status_projects.aggregate([{$project:{clock:{"$multiply":['$clock',1000]},name:1}},{$match:{clock:{$gt:1513612800}}},{$group:{_id:{projectName:"$name"},time:{$sum:"$clock"},count:{$sum:1}}},{$sort:{count:-1}}])


复杂示例3:

db.page_status_projects.aggregate([{$match:{clock:{$gt:1513612800}}},{$project:{clock:{"$divide":['$clock',3600]},name:1}},{$group:{_id:{projectName:"$name"},time:{$sum:"$clock"},count:{$sum:1}}},{$sort:{count:-1}},{$limit:10}])

官方文档:
https://docs.mongodb.com/manual/reference/operator/aggregation/

猜你喜欢

转载自blog.csdn.net/liuxiaoxiaosmile/article/details/79666391