Spring Data MongoDB 六:進階Aggregation操作(上)
一、Aggregate簡介
db.collection.aggregate()是基於資料處理的聚合管道,每個文件通過一個由多個階段(stage)組成的管道,可以對每個階段的管道進行分組、過濾等功能,然後經過一系列的處理,輸出相應的結果。
1、db.collection.aggregate()可以多個管道,能方便的進行資料的處理。
2、db.collection.aggregate()使用了MongoDB
3、 每個階段管道限制為100MB的記憶體。如果一個節點管道超過這個極限,MongoDB將產生一個錯誤。為了能夠在處理大型資料集,可以設定allowDiskUse為true來在聚合管道節點把資料寫入臨時檔案。這樣就可以解決100MB的記憶體的限制。
4、db.collection.aggregate()可以作用在分片集合,但結果不能輸在分片集合,MapReduce可以 作用在分片集合,結果也可以輸在分片集合。
5、db.collection.aggregate()
6、db.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進階之介面(2):IDisposable,ICollectionView
原始碼地址:https://www.xuebuyuan.com/892590.html 廢話不多說,進入正題,先來說說IDisposable,看例子(來自MSDN): using System;using System.ComponentModel; // 下面的例子
ROS 進階學習筆記(16):ROS導航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 進階學習筆記(17):ROS導航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) 繼承的類(子類)擁有原類(父類)的所有屬