【mongoDB查詢進階】聚合管道(四) -- 累加器(Accumulators)

回顧

相關文章回顧

mongoDB查詢進階--聚合管道(一)回顧
mongoDB查詢進階--聚合管道(二)回顧
mongoDB查詢進階--聚合管道(三)回顧mongodb

管道操做符的分類

管道操做符能夠分爲三類:express

  1. 階段操做符(Stage Operators)
  2. 表達式操做符(Expression Operators)
  3. 累加器(Accumulators)

參考MongoDB官網:https://docs.mongodb.com/manual/reference/operator/aggregationsegmentfault

本篇主要內容是管道操做符中的累加器。code

累加器(Accumulators)

累加器原本只能使用與$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

$sum 求和操做符

用法:get

  • $group下使用
{ $sum: <expression> }
  • $project下使用:
{ $sum: <expression> }
    or
{ $sum: [ <expression1>, <expression2> ... ]  }

說明:io

列子 結果
{ $sum : <field> } 只含數字 全部值的和
{ $sum : <field> } 含數字和非數字 全部數字值的和
{ $sum : <field> } 非數字或不存在 0

舉例:table

請看後面的綜合示例ast

$avg 求均值操做符

用法:class

  • $group下使用
{ $avg: <expression> }
  • $project下使用:
{ $avg: <expression> }
    or
{ $avg: [ <expression1>, <expression2> ... ]  }

舉例:

請看後面的綜合示例

$first 求第一值操做符

用法:

{ $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 求最後值操做符

用法:

{ $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 求最大值操做符

用法:

  • $group下使用
{ $max: <expression> }
  • $project下使用:
{ $max: <expression> }
    or
{ $max: [ <expression1>, <expression2> ... ]  }

舉例:

請看後面的綜合示例

$min 求最小值操做符

用法:

  • $group下使用
{ $min: <expression> }
  • $project下使用:
{ $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 }
]

感謝閱讀~

相關文章
相關標籤/搜索