1. 程式人生 > >Spring Data MongoDB 六:進階Aggregation操作(上)

Spring Data MongoDB 六:進階Aggregation操作(上)

一、Aggregate簡介                                                                           

      db.collection.aggregate()是基於資料處理的聚合管道,每個文件通過一個由多個階段(stage)組成的管道,可以對每個階段的管道進行分組、過濾等功能,然後經過一系列的處理,輸出相應的結果。

          

      1db.collection.aggregate()可以多個管道,能方便的進行資料的處理。

      2db.collection.aggregate()使用了MongoDB

內建的原生操作,聚合效率非常高,支援類似於SQL Group By操作的功能,而不再需要使用者編寫自定義的JavaScript例程。

      3、 每個階段管道限制為100MB的記憶體。如果一個節點管道超過這個極限,MongoDB將產生一個錯誤。為了能夠在處理大型資料集,可以設定allowDiskUsetrue來在聚合管道節點把資料寫入臨時檔案。這樣就可以解決100MB的記憶體的限制。

     4db.collection.aggregate()可以作用在分片集合,但結果不能輸在分片集合,MapReduce可以 作用在分片集合,結果也可以輸在分片集合。

     5db.collection.aggregate()

方法可以返回一個指標(cursor),資料放在記憶體中,直接操作。跟Mongo shell 一樣指標操作。

     6db.collection.aggregate()輸出的結果只能儲存在一個文件中,BSON Document大小限制為16M。可以通過返回指標解決,版本2.6中後面:DB.collect.aggregate()方法返回一個指標,可以返回任何結果集的大小。

二、Aggregate pipeline 引數

          今天主要是pipeline 運用到Spring上

   pipeline 引數】

     pipeline 型別是Array  語法:db.collection.aggregate( [ { <stage> }, ... ] )

         $project:可以對輸入文件進行新增新欄位或刪除現有的欄位,可以自定哪些欄位顯示與不顯示。

         $match :根據條件用於過濾資料,只輸出符合條件的文件,如果放在pipeline前面,根據條件過濾資料,傳輸到下一個階段管道,可以提高後續的資料處理效率。還可以放在out之前,對結果進行再一次過濾。

         $limit :用來限制MongoDB聚合管道返回的文件數

         $skip :在聚合管道中跳過指定數量的文件,並返回餘下的文件。

         $unwind :將文件中的某一個數組型別欄位拆分成多條,每條包含陣列中的一個值。    

         $out :必須為pipeline最後一個階段管道,因為是將最後計算結果寫入到指定的collection中。

         $group : 將集合中的文件分組,可用於統計結果,$group首先將資料根據key進行分組。

       MongoDB上對 pipeline 操作可以檢視

三、舉例子並在MongoDB操作pipeline                                                                                                                      

        舉例【訂單】
db. orders.insert([  
{  
        "onumber" : "001",   
        "date" : "2015-07-02",   
        "cname" : "zcy1",   
         "items" :[ {  
                   "ino" : "001",  
                  "quantity" :2,   
                  "price" : 4.0  
                 },{  
                   "ino" : "002",  
                  "quantity" : 4,   
                  "price" : 6.0  
                }  
                ]  
},{  
         "onumber" : "002",   
        "date" : "2015-07-02",   
        "cname" : "zcy2",   
         "items" :[ {  
                  "ino" : "003",  
                  "quantity" :1,   
                  "price" : 4.0  
                   },{  
                  "ino" : "002",  
                  "quantity" :6,   
                  "price" : 6.0  
                 }  
               ]  
},{  
         "onumber" : "003",   
        "date" : "2015-07-02",   
        "cname" : "zcy2",   
         "items" :[ {  
                  "ino" : "004",  
                  "quantity" :3,   
                  "price" : 4.0  
                   },{  
                  "ino" : "005",  
                  "quantity" :1,   
                  "price" : 6.0  
                 }  
               ]  
},{  
         "onumber" : "004",   
        "date" : "2015-07-02",   
        "cname" : "zcy2",   
         "items" :[ {  
                  "ino" : "001",  
                  "quantity" :3,   
                  "price" : 4.0  
                   },{  
                  "ino" : "003",  
                  "quantity" :1,   
                  "price" : 6.0  
                 }  
               ]  
}
])

        【MongoDB  Aggregation】             我們需要查詢訂單號為001,002,003中的訂單詳情各個產品賣出多少個,並且過濾掉數量小於1的產品
> db.orders.aggregate([
... {$match:{"onumber":{$in:["001","002", "003"]}}},
... {$unwind:"$items"},
... {$group:{_id:"$items.ino",total:{$sum:"$items.quantity"}}},
... {$match:{total:{$gt:1}}}
... ]);
{ "_id" : "004", "total" : 3 }
{ "_id" : "002", "total" : 10 }
{ "_id" : "001", "total" : 2 }

四、AggregationOutput                                                                                                                

           

             Spring Data  MongoDB 專案提供與MongoDB文件資料庫的整合。如果對環境的搭建不清楚可以先看

        我們先介紹Mongo本身提供的com.mongodb.AggregationOutput進行分組查詢,下一篇會介紹Spring Data MongoDB模板封裝的Aggregation方法,我們直接看程式碼

           

               通過模板獲取連線,然後執行Aggregation,該方法是引數可以接受多個引數。AggregationOutput提供了一個方法results是返回了          Iterator<DBObject>           【實現類】                 
	@Override
	public void getAggregation() {
		Set<String> onumberSet=new HashSet<String>();
		onumberSet.add("001");
		onumberSet.add("002");
		onumberSet.add("003");
		//過濾條件
		DBObject queryObject=new BasicDBObject("onumber", new BasicDBObject("$in",onumberSet));
		DBObject queryMatch=new BasicDBObject("$match",queryObject);
		//展開陣列
		DBObject queryUnwind=new BasicDBObject("$unwind","$items");
		//分組統計
		DBObject groupObject=new BasicDBObject("_id",new BasicDBObject("ino","$items.ino"));
		groupObject.put("total", new BasicDBObject("$sum","$items.quantity"));
		DBObject  queryGroup=new BasicDBObject("$group",groupObject);
		//過濾條件
		DBObject finalizeMatch=new BasicDBObject("$match",new BasicDBObject("total",new BasicDBObject("$gt",1)));

		AggregationOutput  output=mongoTemplate.getCollection("orders").aggregate(queryMatch,queryUnwind,queryGroup,finalizeMatch);
		for (Iterator<DBObject> iterator = output.results().iterator(); iterator.hasNext();) {
			DBObject obj =iterator.next();
			System.out.println(obj.toString());
		}
          }

     【測試類】             
public class TestOrders {
	 private static OrdersDao ordersDaoImpl;  
	    private static  ClassPathXmlApplicationContext  app;  
	    @BeforeClass    
	    public static void initSpring() {   
	        try {         
	         app = new ClassPathXmlApplicationContext("classpath:applicationContext-mongo.xml");    
	         ordersDaoImpl = (OrdersDao) app.getBean("ordersDaoImpl");   
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        }  
	           }   
	      
	        @Test   
	        public void testAggregation()  
	        {  
	        	ordersDaoImpl.getAggregation();
	            
	        }  
}

     【結果】                

相關推薦

Spring Data MongoDB Aggregation操作

一、Aggregate簡介                                                                                 db.coll

Spring Data MongoDB文件查詢分頁、Morphia

一.簡介      SpringData  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的find

Spring Data MongoDB新增、刪除操作

一.簡介    Spring  Data  MongoDB 專案提供與MongoDB文件資料庫的整合,Spring與Hibernate整合時,Spring提供了org.springframework.orm.hibernate3.HibernateTemplate實現了對資

Spring Data MongoDB基本文件查詢Query、BasicQuery

一.簡介      Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的CRUD的操作,上一篇我們介紹了對MongoDB的新增和刪除, 今天我們

C++筆記 第十三課面向物件---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第十三課 進階面向物件(上) 你考慮過嗎? 日常生活中,我們都習慣於對事物進行分類。那麼,這種分類的思想是夠可以引入程式設計中呢?是的 1.面向物件基本概念 面向物件

Spring Data MongoDB入門篇環境搭建、簡單的CRUD操作

一.簡介      Spring Data  MongoDB 專案提供與MongoDB文件資料庫的整合。Spring Data MongoDB POJO的關鍵功能區域為中心的模型與MongoDB的DBCollection輕鬆地編寫一個儲存庫互動資料訪問。 二.Spring

spring cloud四 - [斷路器Hystrix]

在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互呼叫(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來呼叫。為了保證其高可用,單個服務通常會叢集部署。由於網路原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,呼叫這

WPF之介面2IDisposable,ICollectionView

原始碼地址:https://www.xuebuyuan.com/892590.html 廢話不多說,進入正題,先來說說IDisposable,看例子(來自MSDN): using System;using System.ComponentModel; // 下面的例子

ROS 學習筆記16ROS導航1關於Costmap_2d Package 代價地圖包

 === 關於Costmap_2d Package === wiki page: http://wiki.ros.org/costmap_2d=== 我遇到的問題是 obstacle layer的重新整理頻率太低 ===  costmap_2d包下的所有類文件:http:

Linux之路部署

經過長期的開發工作,在專案中經常會需要將打包好的專案部署到Linux伺服器上,不過,在此之前需要掌握一些Linux常用命令比如ls、ll、ps -ef|grep java 、cp、tail 等等,詳細的可以百度查一下,還是很多的。接下來,就說一下關於專案的部署。 首先需要一個遠端訪問Linu

Pandas使用DataFrame進行資料分析比賽之路日期資料處理按日期篩選、顯示及統計資料

首先,表格的資料格式如下: 1、獲取某年某月資料 data_train = pd.read_csv('data/train.csv') # 將資料型別轉換為日期型別 data_train[

ROS 學習筆記17ROS導航2關於 move_base Package(底盤移動包)

== 關於move_base 包(底盤移動包?移動底盤包?) == 開始之前,我[email protected]有幾個問題(Link on ROS_Answer)需要搞定: costmap_2d包 與 move_base包 是什麼關係?導航時,在RviZ工具中,

安全類工具制作第005篇程管理器

btn creat lan 控件 lookup 包括 lln create tdi 一、前言 這次的程序是為了完好上一次所編寫的進程管理器。使得當我們選中某一個進程的時候。能夠查看其DLL文件,而且能夠對可疑的模塊進行卸載操作。這樣就能夠有效對抗DLL的

Linux時間子系統之高精度定時器HRTIMER的原理和實現

3.4 size 屬於 running return repr 而是 復雜度 ctu 上一篇文章,我介紹了傳統的低分辨率定時器的實現原理。而隨著內核的不斷演進,大牛們已經對這種低分辨率定時器的精度不再滿足,而且,硬件也在不斷地發展,系統中的定時器硬件的精度也越來越高,這也給

JavaScript的之路函數簡介,變量、作用域和內存問題

ret 優化 person get 簡介 web瀏覽器 都是 add 是把 <h3>ECMAScript中函數不存在函數簽名的概念,沒有重載</h3><h3>無需指定返回值,可以在任何時候返回任何值。未指定返回值的函數,返回的是一個特殊

JavaScript的之路引用類型之Object類型和Array類型

reverse 代碼 -1 替換 fine 設置 sha unshift sum 引用類型 Object類型 function a(num){ if(num>3){ a(--num); } console.log(num);

Python-----靜態方法@staticmethod

class icm 訪問類 prop urn turn pan python進階 spa @staticmethod 靜態方法只是名義上歸屬類管理,但是不能使用類變量和實例變量,是類的工具包放在函數前(該函數不傳入self或者cls),所以不能訪問類屬性和實例屬性 1

雲架構師攻略1

此文已由作者劉超授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。   一、架構的三個維度和六個層面               1.1、三

Kubernetes 1.3 從入門到 安裝篇1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++筆記 第十四課 面向物件---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第十四課 進階面向物件(下) 1.面向物件基本概念 類之間的基本關係 繼承 從已存在類細分出來的類和原類之間具有繼承關係(is-a) 繼承的類(子類)擁有原類(父類)的所有屬