英文文件中是aggregation pipeline,直譯為聚合管道,它可以對資料文件進行變換和組合。聚合管道是基於資料流概念,資料進入管道經過乙個或多個stage,每個stage對資料進行操作(篩選,投射,分組,排序,限制或跳過)後輸出最終結果。
mongodb有4類操作符用於文件的操作,例如find查詢裡面會用到的gte,in等。操作符以$開頭,分為查詢操作符,更新操作符,管道操作符,查詢修飾符4大類。其中管道操作符是用於聚合管道中的操作符。
階段操作符(stage operators)
表示式操作符(expression operators)
累加器(accumulators)
mongodb官網文件
db.collection.aggregate([,])
方法2:
累加器本來只能使用與groud下,但是版本3.2或以上,部分累加器還能使用於project。當在group中使用時,累加器是針對每個分組使用的;當在project中使用時,累加器則是針對每個字面量起作用
操作符簡述
$project
投射操作符,用於重構每乙個文件的字段,可以提取字段,重新命名字段,甚至可以對原有字段進行操作後新增字段
$match
匹配操作符,用於對文件集合進行篩選
$group
分組操作符,用於對文件集合進行分組
$unwind
拆分操作符,用於將陣列中的每乙個值拆分為單獨的文件
$sort
排序操作符, 用於根據乙個或多個欄位對文件進行排序
$limit
限制操作符, 用於限制返回文件的數量
$skip
跳過操作符,用於跳過指定數量的文件
$lookup
連線操作符,用於連線同乙個資料庫中另乙個集合,並獲取指定的文件,類似populate
$count
統計操作符,用於統計文件的數量
[,,
,,,,
,...
]
articles:
[,,
,,,...
]
$match 匹配操作符 對文件集合進行篩選
用法:
}示例:查詢使用者年齡是18歲的使用者
db.users.
aggregate([
}])
$project 投射操作符
說明:重構每乙個文件的字段,可提取字段,重新命名字段,甚至可對原欄位進行操作後新增字段
用法:
}規則specofication的規則
描述欄位名:1 or true
選擇返回的字段
_id: 0 or false
不返回_id(預設返回)
欄位名:表示式
使用表示式,可以用於重新命名字段,或對其值進行操作,或新增字段
欄位名:0 or false
選擇需要不返回什麼字段,注意:當使用這種用法時,就不要用上面的方法
示例1:
db.users.
aggregate([
}])
示例2:
db.users.
aggregate([
}])
示例3:
db.users.
aggregate([
, _id:0}
}])
注:關於管道表示式:最簡單的「project」表示式是包含和排除字段(如: ),以及欄位名稱fieldname(如: )。除此以外,還可以使用表示式操作符(如:toupper)構成更豐富的表示式,將多個字面量和變數組合在一起使用,得到更多有意思的值
$sort 排序操作符
說明:根據乙個或多個欄位對文件進行排序
用法:
}示例:
db.users.
aggregate([
}])
$limit 限制操作符
說明:限制返回的文件的數量
用法:
示例:
db.articles.
aggregate([
])
$skip 跳過操作符
說明:跳過指定數量的文件
用法:
示例:
db.articles.
aggregate([
])
$count 統計操作符
說明:統計文件的數量
用法:
示例:
db.articles.
aggregate([
])
$group 分組操作符
說明:對文件集合進行分組
用法:
, ...}}注:_id是必須的,用於分組的依據條件
示例:
db.users.aggregate([', got 'eof' at end of input: group: }])返回結果:
[
,]
高階示例:
db.users.
aggregate([
,// 求平均值
count:
// 彙總}}
])
返回結果:
[
,]
$unwind 拆分操作符
說明:將陣列中的每乙個值拆分為單獨的文件
用法:
3.2+版本的用法:
}
字段
型別描述
path
string
必填,陣列的欄位名,指定需要拆分的字段
includearrayindex
string
可選,定義返回的欄位名,返回的值是拆分前值在原陣列的位置
preservenullandemptyarrays
boolean
可選,配置在path的值為空或缺失的情況下是否拆分, 預設false
示例:
// 原資料
db.articles.
aggregate([
])// 結果 [,
,,]
高階示例:
// 原始資料[,
,,]// 操作
db.articles.
aggregate([
}])// 結果 [,
,,]// 操作
db.articles.
aggregate([
}]);
// 結果 [,
,,,,
]
$lookup 連線操作符
說明:連線同乙個資料庫中另乙個集合,並獲取指定的文件,類似於populate
用法:
}
字段
描述form
需要關聯的集合名
localfield
本集合中需要查詢的字段
foreignfield
另外乙個集合中需要關聯的字段
as輸出的欄位名
示例:
db.articles.
aggregate([
}])
綜合示例
找出發表文章最多的5位作者,按發表文章排序,顯示他的發表文章的總次數,和他自己的資訊
操作:
db.articles.
aggregate([
,}},
},,}
,}])
mongodb 聚合管道
mongodb聚合管道由多個階段組成。每個階段在文件通過管道時轉換文件。管道階段不需要為每個輸入文件生成乙個輸出文件 例如,有些階段可能會生成新的文件或過濾掉文件。管道階段可以在管道 現多次,但 out merge和 geonear階段除外。有關所有可用階段的列表,請參見聚合管道階段。mongodb...
MongoDB管道聚合各階段
管道聚合各階段 名稱 描述 project 改造流中的文件,像通過增加新的字段或移除存在的字段。對於每乙個輸入文件,輸出乙個文件。match 過濾文件流,只允許匹配的文件不經過修改進入到下乙個管道階段。match使用標準的mongodb查詢。對於每個輸入文件,輸出要麼乙個文件 匹配乙個 要麼零個文件...
無名管道總結
管道的兩種侷限性 1 歷史上他們是半雙工的 也就是說資料只能在乙個方向上流動 現在某些系統提供全雙工的,但是為了最佳可移植性,我們還是按照半雙工來。2 它們只能在具有公共祖先的程序之間使用 乙個管道由乙個程序建立,然後該程序呼叫fork,此後父子就成就可以應用該管道。include int pipe...