博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【mongoDB查询进阶】聚合管道(四) -- 累加器(Accumulators)
阅读量:5891 次
发布时间:2019-06-19

本文共 3521 字,大约阅读时间需要 11 分钟。

回顾

相关文章回顾

管道操作符的分类

管道操作符可以分为三类:

  1. 阶段操作符(Stage Operators)
  2. 表达式操作符(Expression Operators)
  3. 累加器(Accumulators)

本篇主要内容是管道操作符中的累加器。

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

用法:

  • $group下使用
{ $sum: 
}
  • $project下使用:
{ $sum: 
} or{ $sum: [
,
... ] }

说明:

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

举例:

请看后面的综合示例

$avg 求均值操作符

用法:

  • $group下使用
{ $avg: 
}
  • $project下使用:
{ $avg: 
} or{ $avg: [
,
... ] }

举例:

请看后面的综合示例

$first 求第一值操作符

用法:

{ $first: 
}

举例:

假设数据:

[    { _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: 
}

举例:

假设数据:

[    { _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: 
}
  • $project下使用:
{ $max: 
} or{ $max: [
,
... ] }

举例:

请看后面的综合示例

$min 求最小值操作符

用法:

  • $group下使用
{ $min: 
}
  • $project下使用:
{ $min: 
} or{ $min: [
,
... ] }

举例:

请看后面的综合示例

综合示例

假设有一个关于成绩的集合

[    { _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 }]

感谢阅读~

转载地址:http://uqfsx.baihongyu.com/

你可能感兴趣的文章
js replace,正则截取字符串内容
查看>>
作业2
查看>>
nginx的信号量
查看>>
云im php,网易云IM
查看>>
开源 java CMS - FreeCMS2.3字典管理
查看>>
block,inline和inline-block概念和区别
查看>>
移动端常见随屏幕滑动顶部固定导航栏背景色透明度变化简单jquery特效
查看>>
javascript继承方式详解
查看>>
win7家庭版添加组策略编辑器
查看>>
lnmp环境搭建
查看>>
自定义session扫描器精确控制session销毁时间--学习笔记
查看>>
【转】EDK简单使用流程(3)
查看>>
仿射变换
查看>>
分页器(自定制)
查看>>
C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
查看>>
C# LINQ详解(一)
查看>>
视频直播点播nginx-rtmp开发手册中文版
查看>>
ruby学习总结04
查看>>
Binary Tree Paths
查看>>
Ueditor自定义ftp上传
查看>>