mongodb MongoDB 聚合 group(转)
MongoDB 聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
基本语法为:db.collection.aggregate( [ <stage1>, <stage2>, ... ] )
现在在mycol集合中有以下数据:
{ "_id" : 1, "name" : "tom", "sex" : "男", "score" : 100, "age" : 34 }
{ "_id" : 2, "name" : "jeke", "sex" : "男", "score" : 90, "age" : 24 }
{ "_id" : 3, "name" : "kite", "sex" : "女", "score" : 40, "age" : 36 }
{ "_id" : 4, "name" : "herry", "sex" : "男", "score" : 90, "age" : 56 }
{ "_id" : 5, "name" : "marry", "sex" : "女", "score" : 70, "age" : 18 }
{ "_id" : 6, "name" : "john", "sex" : "男", "score" : 100, "age" : 31 }
1、$sum 计算总和。
Sql: select sex,count(*) from mycol group by sex
MongoDb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', personCount: {$sum: 1}}}])

Sql: select sex,sum(score) totalScore from mycol group by sex
MongoDb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', totalScore: {sum:′score'}}}])

2、$avg 计算平均值
Sql: select sex,avg(score) avgScore from mycol group by sex
Mongodb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', avgScore: {avg:′score'}}}])

3、$max 获取集合中所有文档对应值得最大值。
Sql: select sex,max(score) maxScore from mycol group by sex
Mongodb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', maxScore : {max:′score'}}}])

4、$min 获取集合中所有文档对应值得最小值。
Sql: select sex,min(score) minScore from mycol group by sex
Mongodb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', minScore : {min:′score'}}}])

5、$push 把文档中某一列对应的所有数据插入值到一个数组中。
Mongodb: db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', scores : {push:′score'}}}])

6、$addToSet 把文档中某一列对应的所有数据插入值到一个数组中,去掉重复的
db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', scores : {addToSet:′score'}}}])

7、 $first 根据资源文档的排序获取第一个文档数据。
db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', firstPerson : {first:′name'}}}])

8、 $last 根据资源文档的排序获取最后一个文档数据。
db.mycol.aggregate([{group: {_id: 'group: {_id: 'sex', lastPerson : {last:′name'}}}])

9、全部统计 null
db.mycol.aggregate([{group:{_id:null,totalScore:{group:{_id:null,totalScore:{push:'$score'}}}])

例子
现在在t2集合中有以下数据:
{ "country" : "china", "province" : "sh", "userid" : "a" }
{ "country" : "china", "province" : "sh", "userid" : "b" }
{ "country" : "china", "province" : "sh", "userid" : "a" }
{ "country" : "china", "province" : "sh", "userid" : "c" }
{ "country" : "china", "province" : "bj", "userid" : "da" }
{ "country" : "china", "province" : "bj", "userid" : "fa" }
需求是统计出每个country/province下的userid的数量(同一个userid只统计一次)
过程如下。
首先试着这样来统计:
db.t2.aggregate([ { group: {"_id": { "country" : "group: {"_id": { "country" : "country", "prov": "province"} , "number":{province"} , "number":{sum:1}} } ])
结果是错误的:

原因是,这样来统计不能区分userid相同的情况 (上面的数据中sh有两个 userid = a)
为了解决这个问题,首先执行一个group,其id 是 country, province, userid三个field:
db.t2.aggregate([ { group: {"_id": { "country" : "group: {"_id": { "country" : "country", "province": "province","uid":"province","uid":"userid" } } } ])

可以看出,这步的目的是把相同的userid只剩下一个。
然后第二步,再第一步的结果之上再执行统计:
db.t2.aggregate([
{ group: {"_id": { "country" : "group: {"_id": { "country" : "country", "province": "province","uid":"province","uid":"userid" } } } ,
{ group: {"_id": { "country" : "group: {"_id": { "country" : "_id.country", "province": "_id.province" }, count : {_id.province" }, count : {sum : 1 } } }
])
这回就对了

加入一个$project操作符,把_id去掉
db.t2.aggregate([ { group: {"_id": { "country" : "group: {"_id": { "country" : "country", "province": "province","uid":"province","uid":"userid" } } } ,
{ group: {"_id": { "country" : "group: {"_id": { "country" : "_id.country", "province": "_id.province" }, count: {_id.province" }, count: {sum : 1 } } },
{ project : {"_id": 0, "country" : "project : {"_id": 0, "country" : "_id.country", "province" : "$_id.province", "count" : 1}}
])
最终结果如下:

管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
1、$project实例
db.mycol.aggregate({$project:{name : 1, score : 1}})

这样的话结果中就只还有_id,name和score三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:
db.mycol.aggregate({$project:{_id : 0, name : 1, score : 1}})

2、$match实例
match用于获取分数大于30小于并且小于100的记录,然后将符合条件的记录送到下一阶段match用于获取分数大于30小于并且小于100的记录,然后将符合条件的记录送到下一阶段group管道操作符进行处理
db.mycol.aggregate([{match :{score: {gt: 30, lt: 100}}},{group:{_id:'sex',count:{sum:1}}}])

3、完整实例
db.cost_price.aggregate([
{"$match":{"sku_id":{"$in":[,,]},"work_time":{"$lte":"2018-01-01"}}},
{"$group":{"_id":"$sku_id","cost_price":{"$last":"$cost_price"},"work_time":{"$last":"$work_time"}}},
{"$project" : {"cost_price" : ,"work_time" : }}
]);
mongodb MongoDB 聚合 group(转)的更多相关文章
- mongodb MongoDB 聚合 group
MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...
- mongodb聚合 group
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...
- MongoDB 聚合Group(一)
原文:http://blog.csdn.net/congcong68/article/details/45012717 一.简介 db.collection.group()使用JavaScript,它 ...
- 【翻译】MongoDB指南/聚合——聚合管道
[原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...
- MongoDB数据库聚合
前面的话 聚合操作主要用于对数据的批量处理,将记录按条件分组以后,然后再进行一系列操作,例如,求最大值.最小值.平均值,求和等操作.聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘.在 ...
- MongoDB,分组,聚合
使用聚合,db.集合名.aggregate- 而不是find 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数.MongoDB的聚合管道将MongoDB文档在一个管道处理完 ...
- mongodb高级聚合查询
在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...
- Yii2的mongodb的聚合操作
最近项目使用到mongodb的聚合操作,但是yii文档中对这方面资料较少,记录下 $where['created_time'] = ['$gt' => "$start_date_str ...
- mongodb高级聚合查询(转)
在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...
随机推荐
- SRA秘钥生成与解密
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java ...
- 微信小程序图片上传并展示
1.首先编写微信小程序的页面和样式: index.js var total = []; Page({ data: { perImgSrc: [] }, onLoad: function (option ...
- Python学习摘录(上)
1:接收输入 var=raw_input() 注意:raw_input()总数接收字符串形式的输入.所以,如果我们想接收其他类型的数据,则需要强制类型转换.(如果转换失败,就会抛出异常) 2:pass ...
- Eclipse项目修改没有同步到编译的问题
有两个原因: 1:项目有错,不能正常编译:查看是否有Jar包冲突.JDK版本问题等: 2:编译输出目录配置错误: Maven项目会修改项目编译时的输出路径到target文件夹,但是我们用Myelips ...
- 【leetcode】solution in java——Easy1
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6409067.html 1:Hamming distance The Hamming distance betw ...
- Java之创建对象>5.Avoid creating unnecessary objects
String s = new String("stringette"); // DON'T DO THIS! The improved version is simply the ...
- .NET/ASP.NET/C#/WCF/SQL Server/My SQL/Java/JSP/JDBC/Spring/Spring MVC/PHP/Python/Ruby/Shell/Agile/CSS/HTML/HTTP/Unix/Linux大量PDF书籍/电子书籍下载, Effective Java 下载
223本电子书籍,囊括了.NET/ASP.NET/C#/WCF/SQL Server/My SQL/Java/JSP/JDBC/Spring/Spring MVC/PHP/Python/Shell/A ...
- 写了一个简单的Linux Shell用来下载文件
#!/bin/sh ; i<; i=i+ )); do # 利用spider来探测请求的资源是否存在,并把请求的结果写入到一个文件 wget --spider --http-user=usern ...
- spring 配置bean的方法及依赖注入发方式
Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).FactoryBean 这里依据全类名配置bean <bean id="helloWo ...
- 【DB2】性能管理视图
1.性能管理部分视图列表 可以使用命令db2 list tables for schema sysibmadm获取所有的性能管理视图 视图名称 模式名 ...