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. C#之Dispose

    前言 谈到Dispose,首先需要理解C#的资源 资源类型 托管资源:由CLR创建和释放 非托管资源:资源的创建和释放不由CLR管理.比如IO.网络连接.数据库连接等等.需要开发人员手动释放. 如何释 ...

  2. [RabbitMQ]01. 在 Win10 下通过 Docker 安装

    目录 win10家庭版 win10专业版和企业版 1. 开启Hyper-v 2. 安装Toolbox工具 3. 运行安装文件 4. 启动docker 5. 安装rabbitmq 6. 网页访问rabb ...

  3. kubernetes实战-交付dubbo服务到k8s集群(六)使用blue ocean流水线构建dubbo-consumer服务

    我们这里的dubbo-consumer是dubbo-demo-service的消费者: 我们之前已经在jenkins配置好了流水线,只需要填写参数就行了. 由于dubbo-consumer用的gite ...

  4. 一句话木马的简单例子 网站webshell & 远程连接

    一  概述 本地 kail  linux 目标 windows nt 服务器 二 过程 首先编写一句话木马  index.php 一句话木马的原理就是把C=xxx 字符串当成php语句执行 注意这里用 ...

  5. Leetcode(83)-删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

  6. codeforce 3C

    B. Lorry time limit per test 2 seconds memory limit per test 64 megabytes input standard input outpu ...

  7. springboot demo(二)web开发demo

    如入门般建立项目,引入依赖: <dependencies> <dependency> <groupId>org.springframework.boot</g ...

  8. HDU 3920 Clear All of Them I(状压DP)题解

    题意:2n个点,一个起点,开n枪,每枪必须打两个点,花费为起点到其中一点距离加上两点距离.问打完2n个点的最小花费. 思路:很显然应该dp状态,然后枚举i j两个空位置去填,那么复杂度$O(20 * ...

  9. PerformanceObserver API All In One

    PerformanceObserver API All In One 性能监控 https://developer.mozilla.org/en-US/docs/Web/API/Performance ...

  10. SEO & JSON-LD & structured-data

    SEO & JSON-LD & structured-data script type="application/ld+json" script type=&quo ...