MongoDB 分组聚合Group操作(基于MongoTemplate)

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

一.简介

db.collection.group()主要使用了JavaScript语法。
sql语句中group by可以直接使用select key from table groupby key,而mongoDB没提供SQL那样通过Group By就轻松实现数据库的分组功能,我们通过接口来实现的
接口规则: db.collection.group({ key, reduce, initial[, keyf] [, cond] [, finalize] })
key:分组的值,select key from table groupby key 相当于sql中key
keyf:这个是可选的,作用和key相同,但是又不同,keyf可以对数据中的某个或多个字段进行操作以后再分组
reduce:对返回的值进行操作(group有一个弊端,就是需要返回的值,必须每一个都要操作,例子中会讲)
initial:初始化值,比如你要求编号为1的所有设备的数量,就需要加一个字段,并且值为0
cond:过滤条件
finalize:在db.collection.group()返回结果之前,可以对已经得到的数据进行进一步处理

例子

(基于MongoTemplate对mongodb的分组操作):

Criteria criteria = new Criteria();//这里可以添加查询条件
//大于和小于某个时间范围
criteria.and(TestFieldConst.TESTFIELD_UTC_TIME_KEY).gte(devices.getStartTime()).lte(devices.getEndTime());
GroupBy groupBy = GroupBy.keyFunction("function (doc){return{'utc_time':doc.utc_time%"+dateNumber+"};}")
.initialDocument("{motion:'',position_3d:''}") 
	.reduceFunction("function(doc, prev){"
	+ "prev.motion = doc.motion;"  
	+ "prev.position_3d = doc.position_3d ;" 
	+ "}"); 
	+ 
GroupByResults<BasicDBObject> groupData = 
			mongoTemplate.group(criteria, TestFieldConst.OBE_KEY, groupBy, BasicDBObject.class);

解释:

doc表示原来的数据
prev表示处理后的数据
key也可以直接使用,GroupBy.key(“字段名”)
keyFunction后面的语句表示将utc_time这个字段取余dateNumber再分组,比如我取余60,就代表我每60条数据取一条,因为utc_time是时间戳,秒单位的,取余60就代表每分钟取一条数据
initialDocument表示需要返回的字段,如果我需要返回数据中motion和position_3d(但是在reduceFunction中需要将doc里的数据传到prev中才行),如果我想要统计我每个分组有多少条数据(显然是60,因为utc_time是取余60的),这里initialDocument就需要加上total
reduceFunction是用来处理数据的,prev.motion = doc.motion表示将原来数据直接怼到现在结果中,而total直接使用out.total+=1
finalize 可以对最后的结果做进一步的处理

以上只是我在使用中的一点见解,具体请参考https://blog.csdn.net/congcong68/article/details/45012717
这篇文章写的很详细。

猜你喜欢

转载自blog.csdn.net/qq_28483283/article/details/83578815
今日推荐