mongoDB查詢進階--聚合管道(一)回顧
mongoDB查詢進階--聚合管道(二)回顧
mongoDB查詢進階--聚合管道(三)回顧mongodb
管道操做符能夠分爲三類:express
參考MongoDB官網:https://docs.mongodb.com/manual/reference/operator/aggregationsegmentfault
本篇主要內容是管道操做符中的累加器。code
累加器原本只能使用與$groud下,可是版本3.2或以上,部分累加器還能使用於$project。當在$group中使用時,累加器是針對每一個分組使用的;當在$project中使用時,累加器則是針對每一個字面量起做用。排序
操做符 | 簡述 |
---|---|
$sum | 求和操做符,v3.2+能夠用於$group或是$poject |
$avg | 求均值操做符,v3.2+能夠用於$group或是$poject |
$first | 用於返回分組的第一個值,只能用於$group |
$last | 用於返回分組的最後一個值,只能用於$group |
$max | 用於返回分組的最大值,v3.2+能夠用於$group或是$poject |
$min | 用於返回分組的最小值,v3.2+能夠用於$group或是$poject |
用法:get
{ $sum: <expression> }
{ $sum: <expression> } or { $sum: [ <expression1>, <expression2> ... ] }
說明:io
列子 | 值 | 結果 |
---|---|---|
{ $sum : <field> } |
只含數字 | 全部值的和 |
{ $sum : <field> } |
含數字和非數字 | 全部數字值的和 |
{ $sum : <field> } |
非數字或不存在 | 0 |
舉例:table
請看後面的綜合示例ast
用法:class
{ $avg: <expression> }
{ $avg: <expression> } or { $avg: [ <expression1>, <expression2> ... ] }
舉例:
請看後面的綜合示例
用法:
{ $first: <expression> }
舉例:
假設數據:
[ { _id: 1, name: 'kate', class: 'a' }, { _id: 2, name: 'jack', class: 'a' }, { _id: 3, name: 'kent', class: 'b' }, ]
操做:
db.collection.aggregate( [ { $group: { _id: "$class", firstPersonName: { $first: "$name" } } } ] )
結果:
[ { _id: 'a', firstPersonName: 'kate' }, { _id: 'b', firstPersonName: 'kent' }, ]
用法:
{ $last: <expression> }
舉例:
假設數據:
[ { _id: 1, name: 'kate', class: 'a' }, { _id: 2, name: 'jack', class: 'a' }, { _id: 3, name: 'kent', class: 'b' }, ]
操做:
db.collection.aggregate( [ { $group: { _id: "$class", firstPersonName: { $last: "$name" } } } ] )
結果:
[ { _id: 'a', firstPersonName: 'jack' }, { _id: 'b', firstPersonName: 'kent' }, ]
用法:
{ $max: <expression> }
{ $max: <expression> } or { $max: [ <expression1>, <expression2> ... ] }
舉例:
請看後面的綜合示例
用法:
{ $min: <expression> }
{ $min: <expression> } or { $min: [ <expression1>, <expression2> ... ] }
舉例:
請看後面的綜合示例
假設有一個關於成績的集合
[ { _id: 1, name: 'kate', score: 80, class: 'a', subject: 'A' }, { _id: 2, name: 'kate', score: 60, class: 'a', subject: 'B' }, { _id: 3, name: 'jack', score: 90, class: 'a', subject: 'A' }, { _id: 4, name: 'jack', score: 60, class: 'a', subject: 'B' }, { _id: 5, name: 'nick', score: 80, class: 'b', subject: 'A' }, { _id: 6, name: 'nick', score: 90, class: 'b', subject: 'B' }, { _id: 7, name: 'kent', score: 50, class: 'b', subject: 'A' }, { _id: 7, name: 'kent', score: 30, class: 'b', subject: 'B' }, ]
需求:
操做:
db.collection.aggregate( [ { $group: { _id: "$subject", maxScore: { $max: '$score' }, minScore: { $min: '$score' }, avgScore: { $avg: '$score' }, } } ] )
結果:
[ { _id: 'A', maxScore: 90, minScore: 50, avgScore: 75 }, { _id: 'B', maxScore: 90, minScore: 30, avgScore: 60 }, ]
需求:
操做:
db.collection.aggregate( [ { $group: { _id: "$name", totalScore: { $sum: '$score' } } }, { $sort: { totalScore: -1 } }, { $project: { _id: 0, name: '$_id', totalScore: 1, } } ] )
結果:
[ { name: 'nick', totalScore: 170 }, { name: 'jack', totalScore: 150 }, { name: 'kate', totalScore: 140 }, { name: 'kent', totalScore: 80 } ]
感謝閱讀~