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
finalize 可以對最後的結果做進一步的處理
以上只是我在使用中的一點見解,具體請參考https://blog.csdn.net/congcong68/article/details/45012717
這篇文章寫的很詳細。