MongoDB中文手册|官方文档中文版 https://docs.mongoing.com/

  聚合操作处理数据记录和 return 计算结果。聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果。

   MongoDB 提供了三种执行聚合的方法:聚合管道,map-reduce function和单一目的聚合方法。

  管道使用MongoDB中的原生操作提供有效的数据聚合,并且是MongoDB中数据聚合的首选方法。

  一、聚合管道

  MongoDB 的Aggregation framework是以数据处理管道的概念为蓝本的。文档进入多阶段管道,将文档转换为聚合结果。

  聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()

  语法:db.集合名称.aggregate([{管道:{表达式}}])

  管道在MongoDB中一般用于将当前命令的输出结果作为下一个命令的输入

  常用管道

  1、$group:将集合中的文档分组,可用于统计结果

  2、$match:过滤数据,只输出符合条件的文档

  3、$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果

  4、$sort:将输入文档排序后输出

  5、$limit:限制聚合管道返回的文档数

  6、$skip:跳过指定数量的文档,并返回余下的文档

  7、$unwind:将数组类型的字段进行拆分

  

  表达式:处理输入文档并输出

  语法:表达式:'$列名'

  常用表达式

  1、$sum:计算总和,$sum:1同count表示计数

  2、$avg:计算平均值

  3、$min:获取最小值

  4、$max:获取最大值

  5、$push:在结果文档中插入值到一个数组中

  6、$first:根据资源文档的排序获取第一个文档数据

  7、$last:根据资源文档的排序获取最后一个文档数据

  $group

  将集合中的文档分组,可用于统计结果,

  _id表示分组的依据,使用某个字段的格式为'$字段'

  例如:统计订单表中每天订单的数量:

db.order.aggregate(
[
{ $group: { _id: "date", count: { "$sum": 1 } } }
])

  Group by null

  将集合中所有文档分为一组

  求订单总数

db.order.aggregate(
[
{ $group: {_id:null, count: { "$sum": 1 } } }
])

  透视数据

  统计detail10集合中,直播和视频的标题

db.detail10.aggregate(
[
{ $match: { name: '央视新闻',date:'2020-10-08',tag:{'$in':['视频','直播']}} },
{ $group: { _id: '$tag', title: { '$push': '$title'} } }
])

结果:

{ "_id" : "直播", "title" : [ "《新闻1+1》| 急救设备,能成为公共场所的“标配”吗?", "夜游西安乐华城 “月赏”秦汉古风新 国潮", "多地直击假日返程高峰", "长假首日 品中国国际动漫节的“中国风”", "《新闻1+1》| 急救设备,能成为公共场所的“标配”吗?", "夜游西安乐华城 “月赏”秦汉古风新国潮", "多地直击假日返程高峰", "长假首日 品中国国际动漫节的“中国风”" ] }
{ "_id" : "视频", "title" : [ "假期要结束了朱广权段子还在", "天问一号飞控团队有成员生于1998年", "美加州出现血红色满月", "广州灯光秀夜空拼出钟南山肖像", "来自新闻联播的双节祝福", "曾在武汉共同抗疫他们 结婚了!", "假期要结束了朱广权段子还在", "天问一号飞控团队有成员生于1998年", "美加州出现血红色满月", "广州灯光秀夜空拼出钟南山肖像", "来自新闻联播的双节祝福", "曾在武汉共同抗疫他们 结婚了!" ] }

  $match

   用于过滤数据,只输出符合条件的文档

   使用MongoDB的标准查询操作

   例如,查询name为央视新闻,日期为2020-10-08的记录中每个tag值对应的记录数量

db.detail10.aggregate(
[
{ $match: { name: "央视新闻",date:'2020-10-08' } }, { $group: { _id: "$tag", count: { "$sum": 1 } } }
])

  $project

   修改输入文档的结构,如重命名、增加、删除字段、创建计算结果

  

db.detail10.aggregate(
[
{ $match: { name: '央视新闻',date:'2020-10-08',tag:{'$in':['视频','直播']}} },
{ $group: { _id: "$tag", count: { "$sum": 1 } } },
{ $project: { _id: 0, count:1} }
])

  $sort

  将输入文档排序后输出

  查询tag对应记录数量,按统计数量升序

db.detail10.aggregate(
[
{ $match: { name: "央视新闻",date:'2020-10-08' } }, { $group: { _id: "$tag", count: { "$sum": 1 } } }, {$sort:{count:1}}
])

  结果:

{ "_id" : "小视频", "count" : 6 }
{ "_id" : "直播", "count" : 8 }
{ "_id" : "视频", "count" : 12 }
{ "_id" : "微头条", "count" : 16 }
{ "_id" : "文章", "count" : 366 }

  $limit

  限制聚合管道返回的文档数,

  例如返回上面返回结果2条记录:

db.detail10.aggregate(
[
{ $match: { name: "央视新闻",date:'2020-10-08' } }, { $group: { _id: "$tag", count: { "$sum": 1 } } }, {$sort:{count:1}}, {$limit:2}
])

  结果:

{ "_id" : "小视频", "count" : 6 }
{ "_id" : "直播", "count" : 8 }

  

  $unwind

  语法1

  将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值

  构造数据:

db.test.insert({item:'新闻',tag:['视频','直播','文章','小视频','微头条']})
db.test.aggregate([{$unwind:'$tag'}])
结果:
{ "_id" : ObjectId("5feadb227aa0648519c1ad4a"), "item" : "新闻", "tag" : "视频" }
{ "_id" : ObjectId("5feadb227aa0648519c1ad4a"), "item" : "新闻", "tag" : "直播" }
{ "_id" : ObjectId("5feadb227aa0648519c1ad4a"), "item" : "新闻", "tag" : "文章" }
{ "_id" : ObjectId("5feadb227aa0648519c1ad4a"), "item" : "新闻", "tag" : "小视频" }
{ "_id" : ObjectId("5feadb227aa0648519c1ad4a"), "item" : "新闻", "tag" : "微头条" }

  语法2:

    对某字段值进行拆分,

    处理空数组、非数组、无字段、null情况

  

db.inventory.aggregate([{
$unwind:{
path:'$字段名称',
preserveNullAndEmptyArrays:<boolean>#防止数据丢失
}
}])

  构造数据:

db.test.insert([
{ "_id" : 1, "item" : "a", "tag": ['视频','直播','文章','小视频','微头条'] },
{ "_id" : 2, "item" : "b", "tag" : [ ] },
{ "_id" : 3, "item" : "c", "tag": "视频" },
{ "_id" : 4, "item" : "d" },
{ "_id" : 5, "item" : "e", "size" : null }
])

  使用语法1查询

db.test.aggregate([{$unwind:'$tag'}])

结果:

{ "_id" : 1, "item" : "a", "tag" : "视频" }
{ "_id" : 1, "item" : "a", "tag" : "直播" }
{ "_id" : 1, "item" : "a", "tag" : "文章" }
{ "_id" : 1, "item" : "a", "tag" : "小视频" }
{ "_id" : 1, "item" : "a", "tag" : "微头条" }
{ "_id" : 3, "item" : "c", "tag" : "视频" }

查看查询结果,发现对于空数组、无字段、null的文档,都被丢弃了

如何能不丢弃呢?使用语法2

db.test.aggregate([{$unwind:{path:'$tag',preserveNullAndEmptyArrays:true}}])
{ "_id" : 1, "item" : "a", "tag" : "视频" }
{ "_id" : 1, "item" : "a", "tag" : "直播" }
{ "_id" : 1, "item" : "a", "tag" : "文章" }
{ "_id" : 1, "item" : "a", "tag" : "小视频" }
{ "_id" : 1, "item" : "a", "tag" : "微头条" }
{ "_id" : 2, "item" : "b" }
{ "_id" : 3, "item" : "c", "tag" : "视频" }
{ "_id" : 4, "item" : "d" }
{ "_id" : 5, "item" : "e", "size" : null }

  

  

mongodb 聚合(aggregate)的更多相关文章

  1. MongoDB聚合(aggregate)

    一.基础 1.什么是聚合? 聚合是基于数据处理的聚合管道,每个文档通过一个有多个阶段(stage)组成的管道可以对每个阶段的管道进行分组.过滤等功能,然后经过一系列的处理,输出相应的结果 db.集合名 ...

  2. MongoDB的aggregate聚合

    聚合框架中常用的几个操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档.(显示的列,相当遇sql 的) $match:用于过滤数据,只输出符 ...

  3. mongodb的聚合aggregate|group|match|project|sort|limit|skip|unwind

    聚合 aggregate 聚合(aggregate)主要用于计算数据,类似sql中的sum().avg() 语法 db.集合名称.aggregate([{管道:{表达式}}]) 管道 管道在Unix和 ...

  4. MongoDB(七):聚合aggregate

    1. 聚合aggregate 聚合主要用于计算数据,类似sql中的sum().avg() 语法: db.集合名称.aggregate([{管道:{表达式}}]) stu准备的数据: db.stu.in ...

  5. mongodb聚合查询-aggregate

    Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...

  6. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  7. mongodb MongoDB 聚合 group

    MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...

  8. MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  9. MongoDB聚合

    --------------------MongoDB聚合-------------------- 1.aggregate():     1.概念:         1.简介             ...

随机推荐

  1. 鸟哥的linux私房菜——第九章学习(vim编辑器)

    第九章vim编辑器 1.0).vi与vim Linux下文本界面的文书编辑器通常会有常常听到的就有: emacs, pico, nano, joe, 与 vim 等等. vi的优势: 所有的 Unix ...

  2. Crontab 简单实现树莓派语音闹钟

    树莓派实验室按:这是来自 hyhmnn 的投稿.是时候关掉你的手机闹铃了,用树莓派外接一个音箱就可以 Make 一款科技感和实用性兼备的"AI 闹钟".这里用到了 Linux 的计 ...

  3. 美团CodeM资格赛第二题

    锦标赛 时间限制:1秒 空间限制:32768K 组委会正在为美团点评CodeM大赛的决赛设计新赛制.比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分. ...

  4. 白日梦的ES笔记三:万字长文 Elasticsearch基础概念统一扫盲

    目录 一.导读 二.彩蛋福利:账号借用 三.ES的Index.Shard及扩容机制 四.ES支持的核心数据类型 4.1.数字类型 4.2.日期类型 4.3.boolean类型 4.4.二进制类型 4. ...

  5. ARM汇编---程序获取符号的物理地址

    在移植u-boot的过程看到过u-boot在重定向时的实现,当时不知道怎么就觉得很好理解就把这个知识点没怎么深入的理解,最近在看华为的鸿蒙OS在Cortex-A平台上的实现过程时再次遇到一时间看不太懂 ...

  6. Keras 报错: Error when checking target: expected dense_4...

    笔者此处是一个回归任务, 最后一层是: ... pred = Dense(1)(x) 在最后一个Dense层前加上x = Flatten()(x)即可.

  7. CSS 滚动条宽度 All In One

    CSS 滚动条宽度 All In One 滚动条宽度 IE 16px Chrome 12px scrollbar width bug 改变设计稿的宽度,没考虑到 scrollbar width sol ...

  8. 如何优雅的阅读 GitHub 上开源 js 框架和库的源码

    如何优雅的阅读 GitHub 上开源 js 框架和库的源码 step 先总后分,即先了解一下啊框架的大体架构,又一个全局的认识,在选择某些和感兴趣的部分,仔细阅读,各个击破: 带着问题阅读,用到了什么 ...

  9. chroot vs docker

    chroot vs docker chroot Linux A chroot on Unix operating systems is an operation that changes the ap ...

  10. URLSearchParams & Location & URL params parse

    URLSearchParams & Location & URL params parse URL params parse node.js env bug node.js & ...