https://segmentfault.com/a/1190000010618355
前言:一般查詢可以通過find方法,但如果是比較複雜的查詢或者資料統計的話,find可能就無能為力了,這時也許你需要的是aggregate.
什麼是聚合管道(aggregation pipeline)
英文文檔中是aggregation pipeline,直譯為聚合管道,它可以對資料文檔進行變換群組合。聚合管道是基于資料流概念,資料進入管道經過一個或多個stage,每個stage對資料進行操作(篩選,投射,分組,排序,限制或跳過)後輸出最終結果。
解釋
- orders是一個文檔集合
- aggregate是聚合方法,參數是數組,每個數組元素的就是一個stage,對資料進行處理,處理完流到下一個stage
- $match是比對操作符,篩選出status是A的文檔
- $group是分組操作符,以cust_id為分組條件,相同的cust_id分為同組
- $sum是算術操作符,{ $sum: '$amount' }表示分組後,計算amount的總和。
管道操作符介紹
mongoDB中有許多操作符,在aggregate中每個stage可以使用的操作符叫做管道操作符,以下列舉比較常用的管道操作符:
操作符 | 簡述 |
---|---|
$project | 投射操作符,用于重構每一個文檔的字段,可以提取字段,重命名字段,甚至可以對原有字段進行操作後新增字段 |
$match | 比對操作符,用于對文檔集合進行篩選 |
$group | 分組操作符,用于對文檔集合進行分組 |
$unwind | 拆分操作符,用于将數組中的每一個值拆分為單獨的文檔 |
$sort | 排序操作符,用于根據一個或多個字段對文檔進行排序 |
$limit | 限制操作符,用于限制傳回文檔的數量 |
$skip | 跳過操作符,用于跳過指定數量的文檔 |
$lookup | 連接配接操作符,用于連接配接同一個資料庫中另一個集合,并擷取指定的文檔,類似于populate |
$count | 統計操作符,用于統計文檔的數量 |
小結
db.collection.aggregate([])是聚合管道查詢使用的方法,參數是數組,每個數組元素就是一個stage,stage中運用操作符對資料進行處理後再交由下一個stage,直到沒有下個stage,就輸出最終的結果,而資料的處理則是通過使用操作符,本文先簡單介紹了一下有哪些常用的操作符,下一篇再詳細說明。