aggregat聚合管道總結 一

2021-10-08 04:17:26 字數 4256 閱讀 6925

英文文件中是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...