7.MongoDB系列之聚合框架
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系列之聚合框架的更多相关文章
- MongoDB系列六(聚合).
		一.概念 使用聚合框架可以对集合中的文档进行变换和组合.基本上,可以用多个构件创建一个管道(pipeline),用于对一连串的文档进行处理.这些构件包括筛选(filtering).投射(project ... 
- mongodb的高级操作(聚合框架)
		group by 查询 不要用java驱动带的group by ,要用2.2版本后的aggregate聚合框架来搞,经过试验速度快一倍 参考 官网:http://docs.mongodb.org/ma ... 
- MongoDB系列(二):C#应用
		前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ... 
- 在MongoDB中实现聚合函数 (转)
		随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ... 
- MongoDB的aggregate聚合
		聚合框架中常用的几个操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档.(显示的列,相当遇sql 的) $match:用于过滤数据,只输出符 ... 
- 在MongoDB中实现聚合函数
		在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加. ... 
- MongoDB中的聚合操作
		根据MongoDB的文档描述,在MongoDB的聚合操作中,有以下五个聚合命令. 其中,count.distinct和group会提供很基本的功能,至于其他的高级聚合功能(sum.average.ma ... 
- 005.MongoDB索引及聚合
		一 MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录. 这种扫描全集合的查询效率是非常低的,特别在处 ... 
- Sql Server来龙去脉系列之二 框架和配置
		本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ... 
随机推荐
- 使用Python3.7+Tornado5.1配合七牛云存储api来异步切分上传文件
			原文转载自「刘悦的技术博客」https://v3u.cn/a_id_123 之前写了几篇关于FastDfs分布式存储的文章:python3.7.3操作FastDfs来进行文件操作,其实市面上关于云存储 ... 
- Postgres常用时间查询
			如select extract(day from now()); 
- MySQL 的prepare使用中的bug解析过程
			GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 一.问题发现 二.问题调查过程 三.问题解决方案 四.问题总结 一.问题发现 在一次开发中使用 MySQL PREP ... 
- 如何构建 Apache DolphinScheduler 的 Docker 镜像
			继昨日发布第一个 [官方 Docker 镜像] 后,有几位小伙伴私信想自己进行编译,这里也将 Docker 的主要贡献者文禾同学整理的文档进行分享.以下是全文内容: 您能够在类 Unix 系统和 Wi ... 
- LuoguP1283 平板涂色(状压DP)
			参考了I_AM_HelloWord的代码,\(f[i][j]\)表示转态\(i\)时最后一刷为\(j\)的最小代价,上面的块可用暴力填涂,注意边界 #include <cstdio> #i ... 
- DS队列----银行单队列多窗口模拟
			题目描述 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 本 ... 
- Windows下ESP32 环境搭建(基于esp-idf FreeRTOS)
			1. 之前的尝试(失败的尝试) 咸鱼买了3块ESP32开发板.背面写了NODEMCU v1.1,好像这玩意可以直接写lua,也可以刷Micropython写python,还可以用Arduino IDE ... 
- HCIA-Datacom 3.4 实验四:实现VLAN间通信实验
			实验介绍: 划分VLAN后,不同VLAN的用户间不能二层互访,这样能起到隔离广播的作用.但实际应用中,不同VLAN的用户又常有互访的需求,此时就需要实现不同VLAN的用户互访,简称VLAN间互访.华为 ... 
- String vs StringBuffer vs StringBuilder
			String vs StringBuffer vs StringBuilder 本文翻译自:https://www.digitalocean.com/community/tutorials/strin ... 
- 自定义注解,利用AOP实现日志保存(数据库),代码全贴,复制就能用
			前言 1,在一些特定的场景我们往往需要看一下接口的入参,特别是跨系统的接口调用(下发,推送),这个时候的接口入参就很重要,我们保存入参入库,如果出问题就可以马上定位是上游还是下游的问题(方便扯皮) 2 ... 
