1. 程式人生 > >MongoDB 分組聚合Group操作(基於MongoTemplate)

MongoDB 分組聚合Group操作(基於MongoTemplate)

一.簡介

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
這篇文章寫的很詳細。