1. 管道阶段和可调参数

聚合框架基于管道的概念。他由多个阶段组成,每个阶段都会提供一组按钮或可调参数。每个阶段对其输入执行不同的数据处理任务,并生成文档已作为输出传递到下一阶段。

2. 阶段常见操作

匹配(match)、投射(project)、排序(sort)、跳过(skip)、限制(limit)

如以下命令包括此五阶段

db.getCollection('users').aggregate([
{$match: {age: 42}},
{$sort: {username: 1}},
{$skip: 10},
{$limit: 5},
// 投射其实就是文档的展示信息控制
{$project: {_id: 0, username: 1}}
])
2.1 $unwind对数组进行展开
// 展开前
db.food.find({})
_id fruit
1 (Array) 3 Elements
2 (Array) 3 Elements
3 (Array) 3 Elements
// 展开后
db.food.aggregate([
// $fruit表示取字段fruit展开
{$unwind: "$fruit"}
])
_id fruit
1 apple
1 banana
1 peach
2 apple
2 kumquat
2 orange
3 cherry
3 banana
3 apple
2.2 数组表达式
// 首先插入两个文档
db.blog.insert({'title': 'mongo', 'comments': [{'vote': 100, 'info': 'good'}, {'vote': 110, 'info': 'ok'}]});
db.blog.insert({'title': 'es', 'comments': [{'vote': 90, 'info': 'ok'}, {'vote': 80, 'info': 'bad'}]});

过滤出数组中点赞数大于100的文档

// input表示将要过滤的字段$取字段值 as定义变量 $$用来引入表达式中定义的变量
db.blog.aggregate([
{$match: {}},
{$project: {_id: 0, title: 1, comments: {$filter: {input: "$comments", as: 'comment', cond: {$gte: ['$$comment.vote', 110]}}}}}
])

查询结果如下:

{
"title": "mongo",
"comments": [
{
"vote": 110,
"info": "ok"
}
]
}
{
"title": "es",
"comments": [ ]
}
3. 分组简介
// 先插入文档
db.blog.insert({'title': 'es', 'comments': [{'vote': 80, 'info': 'ok'}, {'vote': 70, 'info': 'bad'}]});
// _id为分组的字段,多个可以{title: '$title', 'comments': '$comments'}
// num名称自定义,可以$sum求和 $avg平均等
db.getCollection('blog').aggregate([
{$group: {_id: 'title', num: {$sum: 1}}}
])

分组结果如下:

{
"_id": "title",
"num": 3
}
db.deal_price.aggregate([
{$match: {'city': {'$in': ['东莞', '佛山', '深圳', '长沙', '中山', '广州', '珠海', '韶关', '合肥', '清远', '惠州']}, 'trade_date': {'$gte': ISODate('2022-06-19')}, 'avg_price': {'$ne': null} }},
{$project: {_id: 0, city: 1, region: 1, district_name: 1, avg_price: 1}},
{$group: {_id: {city: '$city', region: '$region', 'district_name': '$district_name'}, avg_price: {$avg: '$avg_price'}}}
])

欢迎关注公众号算法小生沈健的技术博客

7.MongoDB系列之聚合框架的更多相关文章

  1. MongoDB系列六(聚合).

    一.概念 使用聚合框架可以对集合中的文档进行变换和组合.基本上,可以用多个构件创建一个管道(pipeline),用于对一连串的文档进行处理.这些构件包括筛选(filtering).投射(project ...

  2. mongodb的高级操作(聚合框架)

    group by 查询 不要用java驱动带的group by ,要用2.2版本后的aggregate聚合框架来搞,经过试验速度快一倍 参考 官网:http://docs.mongodb.org/ma ...

  3. MongoDB系列(二):C#应用

    前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...

  4. 在MongoDB中实现聚合函数 (转)

    随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...

  5. MongoDB的aggregate聚合

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

  6. 在MongoDB中实现聚合函数

    在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加. ...

  7. MongoDB中的聚合操作

    根据MongoDB的文档描述,在MongoDB的聚合操作中,有以下五个聚合命令. 其中,count.distinct和group会提供很基本的功能,至于其他的高级聚合功能(sum.average.ma ...

  8. 005.MongoDB索引及聚合

    一 MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录. 这种扫描全集合的查询效率是非常低的,特别在处 ...

  9. Sql Server来龙去脉系列之二 框架和配置

    本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...

随机推荐

  1. Percona XtraBackup 8.0.26使用说明

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 Percona XtraBackup特性说明 Percona Xtrabacku ...

  2. Bellman-Ford算法与SPFA算法详解

    PS:如果您只需要Bellman-Ford/SPFA/判负环模板,请到相应的模板部分 上一篇中简单讲解了用于多源最短路的Floyd算法.本篇要介绍的则是用与单源最短路的Bellman-Ford算法和它 ...

  3. 在Go中如何正确重试请求

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/677 我们平时在开发中肯定避不开的一个问题是如何在不可靠的网络服务中 ...

  4. ThreadLocal for Golang

    背景 由于官方不支持 ThreadLocal,在业务中传参经常需要传递 context,造成参数混乱,开发效率低下,跨方法实现传参变得困难. 需要解决的核心问题: 1. 数据存储,g.labels u ...

  5. 【Java】学习路径48-线程锁ReentrantLock

    与上一章学习的线程锁synchronized类似,都是为了解决线程安全的问题. 使用方法: 新建一个ReentrantLock对象.(如果使用Thread多线程,则需要声明static静态) 然后在需 ...

  6. 【java】学习路径32-绝对路径与相对路径

    获取文件路径的时候,我们发现有两个方法,getAbsolutePath和getPath两个方法. 前者是获取绝对路径,后者是相对路径. 绝对路径指的是完整路径,从盘符开始. 相对路径指的是从java当 ...

  7. python自学笔记10:while循环和for循环

    条件控制和循环控制是两种典型的流程控制方法,前面我们写了 if 条件控制,这节讲 for 循环和 while 循环. 循环是另一种控制流程的方式,一个循环体中的代码在程序中只需要编写一次,但可能会连续 ...

  8. win10电脑自动连接蓝牙设备攻略

    每次在电脑上想连接蓝牙耳机,但不想手动去连接怎么办呢? 自动连接! 其实微软已经解决了这个问题,只要打开蓝牙,他就会自动匹配上次连接的设备 打开设置--->设备勾选 "显示使用&quo ...

  9. KingbaseES 时间类型数据和oracle时间类型的区别

    Oracle日期时间类型有两类,一类是日期时间类型,包括Date, Timestamp with time zone, Timestamp with local time zone.另一类是Inter ...

  10. 理解 KingbaseES 中的递归查询

    关键字:SQL,CTE,递归查询 概述:通常递归查询是一个有难度的话题,尽管如此,它们仍使您能够完成在 SQL 中无法实现的操作.本文通过示例进行了简单介绍,并展示了与 PL/SQL的递归查询实现的差 ...