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


常用的表达式如上图。
1.1,aggregate 语法
语法: db.集合名称.aggregate([{管道:{表达式}}])

常用的管道:

1.2,$match 和 $group

往集合 items 中先插入数据
db.items.insert(
[
{quantity:2,price:5.0,pnumber:"p003"},
{quantity:2,price:8.0,pnumber:"p002"},
{quantity:1,price:4.0,pnumber:"p002"},
{quantity:2,price:4.0,pnumber:"p001"},
{quantity:4,price:10.0,pnumber:"p003"},
{quantity:10,price:20.0,pnumber:"p001"},
{quantity:10,price:20.0,pnumber:"p003"},
{quantity:5,price:10.0,pnumber:"p002"}
]
)
查看可视化工具插入的结果如下:

例1:

查询 pnumber:"p001" , 再来看语法 :db.集合名称.aggregate([{管道:{表达式}}])
db.items.aggregate([{"$match":{"pnumber":"p001"}}])

例2:


查询price 大于8的 quantity ,以平均值 avg_quantity表示,并按 pnumber分组。所以分组字段是 $pnumber,平均值avg_quantity,avg_quantity是新的字段名,聚合操作符是 $avg。
db.items.aggregate([
{"$match":{"price":{"$gt":8}}},
{"$group":{"_id":"$pnumber","avg_quantity":{"$avg":"$quantity"}}}
])

例3:

查询 price大于8的quantity,以平均值 avg_quantity 表示,并过滤出平均值大于5的avg_quantity。前半句话是上个例子的,过滤出 是用 $match。
db.items.aggregate([
{"$match":{"price":{"$gt":8}}},
{"$group":{"_id":"$pnumber","avg_quantity":{"$avg":"$quantity"}}},
{"$match":{"avg_quantity":{"$gt":5}}}
])

例4:

按 pnumber分组
db.items.aggregate([
{"$group":{"_id":"$pnumber"}}
])

按 quantity 和 price 分组
db.items.aggregate([
{"$group":{"_id":{"quantity":"$quantity","price":"$price"}}}
])
截了部分屏

1.3,聚合操作符($sum,$avg,$max,$min,$first,$last)
例1($max):

按 pnumber 分组,并求出 每组 price的最大值max_price
db.items.aggregate([
{"$group":
{"_id":"$pnumber",
"max_price":{"$max":"$price"}
}
}
])

例2($min):

按 pnumber分组,并求出每组 price 的最大值 max_price,最小值 min_price
db.items.aggregate([
{"$group":
{"_id":"$pnumber",
"max_price":{"$max":"$price"},
"min_price":{"$min":"$price"}
}
}
])


这个把上面写的 $max,$min一替换就行。
例3($sum):

按pnumber分组,并计算每组的 quantity的总和 count,并按count升序排。这里用了 $sort,注意要在分组完才能 $sort(看好格式)。
db.items.aggregate([
{"$group":
{"_id":"$pnumber","count":{"$sum":"$quantity"}},
},
{"$sort":{"count": 1}}
])

例4:

查询分组后 每个 pnumber 出现的次数,并按升序排
db.items.aggregate([
{"$group":
{"_id":"$pnumber","count":{"$sum":1}},
},
{"$sort":{"count": 1}}
])

例5($addToSet,$push):

按 pnumber 分组,并查出各 pnumber内的price ,price可以重复 (用 $push)
db.items.aggregate([
{"$group":
{"_id":"$pnumber","prices":{"$push":"$price"}}
}
])
结果 是因为添加的数据不太好,所以看不出有没有重复还是重复了。

按 pnumber 分组,并查出各 pnumber内的price ,price不可以重复 (用 $addToSet)
db.items.aggregate([
{"$group":
{"_id":"$pnumber","prices":{"$addToSet":"$price"}}
}
])

1.4,投射 ($project),$add

只保留 _id 和 pnumber,新增 new_price,new_price 就是让 price加1(用到了 $add)
db.items.aggregate([
{
$project:{
"_id":1,
"pnumber":1,
"new_price":{"$add":["$price", 1]}
}
}
])

1.5,排序($sort),限制($limit),跳过($skip)

例1:

取平均价格最贵的前两个pnumber,所以是按pnumber分组($group),再降序排($sort),再限制是前两个($limit)。
db.items.aggregate([
{
"$group":{"_id":"$pnumber","平均价格":{"$avg":"$price"}}
},
{
"$sort":{"平均价格": -1}
},
{
"$limit": 2
}
])

例2:

取平均价格最贵的第二个 pnumber,就是在上个例子的基础上,跳过1个, $skip:1
db.items.aggregate([
{
"$group":{"_id":"$pnumber","平均价格":{"$avg":"$price"}}
},
{
"$sort":{"平均价格": -1}
},
{
"$limit": 2
},
{
"$skip":1
}
])

1.6,随机获取,$sample

db.items.aggregate([
{$sample: {size: 3}}
])

再点运行,就出来不一样的结果

1.7,截取($substr),拼接($concat),转小写($toLower),转大写($toUpper)

例1:

把 pnumber 的下标为 0到2 位置的 截出来,_id 隐藏
db.items.aggregate([
{
$project:{
"_id":0,
"str": {$substr: ["$pnumber", 0, 2]}
}
} ])
因为截取是 左闭右开的截,所以显示是两个字符。

例2:

把 pnumber 字段下的内容 和 "测试" 拼接起来
db.items.aggregate([
{
"$project":{
"_id":0,
"str": {"$concat": ["$pnumber", "测试"]}
}
}
])

例3:

将pnumber的 英文转换为大写
db.items.aggregate([
{
"$project":{"pnumber":{"$toUpper":"$pnumber"}}
}
])

MongoDB的聚合笔记的更多相关文章
- Mongodb Manual阅读笔记:CH6 聚合
6 聚合 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- Mongodb Manual阅读笔记:CH9 Sharding
9.分片(Sharding) Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb ...
- Mongodb Manual阅读笔记:CH8 复制集
8 复制 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- Mongodb Manual阅读笔记:CH7 索引
7索引 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔记 ...
- Mongodb Manual阅读笔记:CH5 安全性
5 安全性 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读 ...
- Mongodb Manual阅读笔记:CH4 管理
4 管理 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
- Mongodb Manual阅读笔记:CH3 数据模型(Data Models)
3数据模型(Data Models) Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mon ...
- Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作
2 Mongodb CRUD 操作 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mong ...
- MongoDB入门---聚合操作&管道操作符&索引的使用
经过前段时间的学习呢,我们对MongoDB有了一个大概的了解,接下来就要开始使用稍稍深入一点的东西了,首先呢,就是MongoDB中的聚合函数,跟mysql中的count等函数差不多.话不多说哈,我们先 ...
- 【翻译】MongoDB指南/聚合——聚合管道
[原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...
随机推荐
- 三维模型OSGB格式轻量化纹理压缩关键技术分析
三维模型OSGB格式轻量化纹理压缩关键技术分析 在三维模型应用中,纹理是一个十分重要的因素,可以使得模型更加真实.精细.随着移动设备和网络传输速度的限制,纹理数据也需要进行轻量化处理,而OSGB格式纹 ...
- Python 潮流周刊#17:Excel 终于支持 Python 了、Meta 重磅开源新项目、Mojo 新得 1 亿美元融资
你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中两则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...
- 文盘Rust -- 生命周期问题引发的 static hashmap 锁
2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了.项目地址:https://github.com/jiashiwen/interactc ...
- 好好回答下 TCP 和 UDP 的区别!
写了这么多篇关于 TCP 和 UDP 的文章,还没有好好聊过这两个协议的区别,这篇文章我们就来开诚布公的谈一谈. 关于 TCP 和 UDP ,想必大家都看过一张这样的图. 有一个小姑娘在对着瓶口慢慢的 ...
- 《Python魔法大冒险》003 两个神奇的魔法工具
魔法师:小鱼,要开始编写魔法般的Python程序,我们首先需要两个神奇的工具:Python解释器和代码编辑器. 小鱼:这两个工具是做什么的? 魔法师:你可以把Python解释器看作是一个魔法棒,只要你 ...
- 大企业才用的分布式唯一Id,它比GUID好
支持.Net Core(2.0及以上)与.Net Framework(4.5及以上) 可以部署在Docker, Windows, Linux, Mac. 分布式唯一Id,顾名思义,是指在全世界任何一台 ...
- 各快 100 倍?4G、5G、6G 相差这么多吗
二狗子今天晚上有点 emo,为什么呢? 原来是二狗子心心念很久的一个手游上线了,二狗子兴冲冲地下载了 40 多分钟,终于下载完了游戏.结果打开游戏一看,发现游戏内部的更新写着预计 30 分钟完成更新. ...
- Python基础合集
入门介绍 01.python由来与发展介绍 02.WEB项目开发流程 第一篇 markdown编辑器 01.markdown基本语法 02.Typora简介与安装 03.Windows上gitee+T ...
- Apifox调用文件下载或Excel导出接口
点发送下面这个发送并下载就行了,,,,,在网上搜了一下午愣是没看到,,,,,,
- 《数据结构》王卓老师 p48-p62学习反馈
跟着青岛大学-王卓老师的视频进行到链队列时,运行链队列代码的时候遇到了两个问题: 1.)Program received signal SIGSEGV Segmentation fault 附代码: ...