mongodb

MongoDB聚合管道——累加器(转)

2022-02-03  本文已影响0人  岑吾

累加器(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 求和操作符

用法:

{ $sum: <expression> }
{ $sum: <expression> }
    or
{ $sum: [ <expression1>, <expression2> ... ]  }

说明:

列子 结果
{ $sum : } 只含数字 所有值的和
{ $sum : } 含数字和非数字 所有数字值的和
{ $sum : } 非数字或不存在 0

举例:

请看后面的综合示例

$avg 求均值操作符

用法:

{ $avg: <expression> }
{ $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 求最大值操作符

用法:

{ $max: <expression> }
{ $max: <expression> }
    or
{ $max: [ <expression1>, <expression2> ... ]  }

举例:

请看后面的综合示例

$min 求最小值操作符

用法:

{ $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 }
]

本文转自:https://segmentfault.com/a/1190000010971393

上一篇下一篇

猜你喜欢

热点阅读