管道概念
以面向對象的思想去理解,整個流水線,能夠理解爲一個數據傳輸的管道;該管道中的每個工做線程,能夠理解爲一個整個流水線的一個工做階段stage,這些工做線程之間的合做是一環扣一環的。靠輸入口越近的工做線程,是時序較早的工做階段stage,它的工做成果會影響下一個工做線程階段(stage)的工做結果,即下個階段依賴於上一個階段的輸出,上一個階段的輸出成爲本階段的輸入。這也是pipeline的一個共有特色!mongodb
爲了迴應用戶對簡單數據訪問的需求,MongoDB2.2版本引入新的功能聚合框架(Aggregation Framework) ,它是數據聚合的一個新框架,其概念相似於數據處理的管道。 每一個文檔經過一個由多個節點組成的管道,每一個節點有本身特殊的功能(分組、過濾等),文檔通過管道處理後,最後輸出相應的結果。管道基本的功能有兩個:框架
一是對文檔進行「過濾」,也就是篩選出符合條件的文檔;
二是對文檔進行「變換」,也就是改變文檔的輸出形式;工具
管道操做符:spa
管道操做符 | Description |
$project線程 |
增長、刪除、重命名字段 |
$match | 條件匹配。只知足條件的文檔才能進入下一階段 |
$limit | 限制結果的數量 |
$skip | 跳過文檔的數量 |
$sort | 條件排序。 |
$group | 條件組合結果 |
$unwind | 將array類型字段拆分紅多條文檔 |
SQL和NOSQL對比:對象
WHERE | $match |
GROUP BY | $group |
HAVING | $match |
SELECT | $project |
ORDER BY | $sort |
LIMIT | $limit |
SUM() | $sum |
COUNT() | $sum |
join | $lookup |
管道表達式:
管道操做符做爲「鍵」,所對應的「值」叫作管道表達式。
例如{$match:{status:"A"}},$match稱爲管道操做符,而status:"A"稱爲管道表達式,是管道操做符的操做數(Operand)。
每一個管道表達式是一個文檔結構,它是由字段名、字段值、和一些表達式操做符組成的。排序
經常使用表達式操做符 | Description |
$addToSet | 將文檔指定字段的值去重 |
$max | 文檔指定字段的最大值 |
$min | 文檔指定字段的最小值 |
$sum | 文檔指定字段求和 |
$avg | 文檔指定字段求平均 |
$gt | 大於給定值 |
$lt | 小於給定值 |
$eq | 等於給定值 |
關於$lookupip
MongoDB 的核心分析工具是 aggregation,經過這個,你能建立一個任務管道(pipeline),對選中的文檔施加各類操做,最後獲得須要的數據。當你要聚合訂單表時,首先在 pipeline 中添加個運算符,來匹配特定的幾類產品的訂單,而後用另外一個運算符分組計算每類產品的銷量。問題是 pipeline 只能對一個集合中的文檔進行操做,所以,若是還須要操做另外一個集合的時候,就玩不轉了。MongoDB 3.2添加了一個 $lookup 操做符 用以引入其它集合的數據。文檔
$lookup 操做符有一個 from 參數,用來指定你想從哪一個集合拖數據。還有一個 on 參數用來指定另外一個集合中的哪一個字段跟 pipeline 中的哪一個字段應該匹配。最後當匹配到一個文檔,該文檔會被插入管道中的文檔,經過 as 參數設定一個 key 把該文檔就放到這個 key 中。這個方式看上去有點暴力, 使文檔變得很大, 別擔憂,其它的聚合操做符會把數據切小的。 $lookup 在聚合管道中有巨大的潛力,可使用戶不須要刻意將數據非正規化。不過咱們要等到 alpha/beta 發佈才能知道 $lookup 在實踐中到底有多有效。 get