1. 程式人生 > >MongoTemplate聚合操作MongoDB

MongoTemplate聚合操作MongoDB

 Aggregation簡單來說,就是提供資料統計、分析、分類的方法,這與mapreduce有異曲同工之處,只不過mongodb做了更多的封裝與優化,讓資料操作更加便捷和易用。Aggregation操作,接收指定collection的資料集,通過計算後返回result資料;一個aggregation操作,從input源資料到output結果資料,中間會依次經過多個stages,整體而言就是一個pipeline;目前有10種stages,我們稍後介紹;它還提供了豐富的Expression(表示式)來輔助計算。

db.collection.aggregate(pipeline, options);
 
pipeline Array
 
# 與mysql中的欄位對比說明
$project # 返回哪些欄位,select,說它像select其實是不太準確的,因為aggregate是一個階段性管道操作符,$project是取出哪些資料進入下一個階段管道操作,真正的最終資料返回還是在group等操作中;
 
$match # 放在group前相當於where使用,放在group後面相當於having使用
 
$sort # 排序1升-1降 sort一般放在group後,也就是說得到結果後再排序,如果先排序再分組沒什麼意義;
 
$limit # 相當於limit m,不能設定偏移量
 
$skip # 跳過第幾個文件
 
$unwind # 把文件中的陣列元素開啟,並形成多個文件,參考Example1
 
$group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ...  # 按什麼欄位分組,注意所有欄位名前面都要加$,否則mongodb就為以為不加$的是普通常量,其中accumulator又包括以下幾個操作符
# $sum,$avg,$first,$last,$max,$min,$push,$addToSet
#如果group by null就是 count(*)的效果
 
$geoNear # 取某一點的最近或最遠,在LBS地理位置中有用
 
$out # 把結果寫進新的集合中。注意1,不能寫進一個分片集合中。注意2,不能寫進
使用MongoTemplate操作Aggregation

    Aggregation agg = Aggregation.newAggregation(    
            Aggregation.match(criteria),//條件  
            Aggregation.group("a","b","c","d","e").count().as("f"),//分組欄位    
            Aggregation.sort(sort),//排序  
            Aggregation.skip(page.getFirstResult()),//過濾  
            Aggregation.limit(pageSize)//頁數  
         );    
    AggregationResults<Test> outputType=mongoTemplate.aggregate(agg,"test",Test.class);    
    List<Test> list=outputType.getMappedResults();