mongodb聚合查询-aggregate
Mongodb-aggregate
在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mongo的聚合操作比mysql复杂。
mysql与mongo聚合类比
SQL 操作/函数 | mongodb聚合操作 |
where | $match |
group by | $group |
having | $match |
select | $project |
order by | $sort |
limit | $limit |
sum() | $sum |
count() | $sum |
join |
$lookup (v3.2 新增) |
1.Aggregation Pipleline
管道将上一个命令输出的数据作为下一个命令的参数。MongoDB中的管道聚合非常实用,提供高效的数据聚合,并且是MongoDB中数据聚合的首选方法
来看一下官方给的图。
aggreagte是一个数组,其中包含多个对象(命令),通过遍历Pipleline数组对collection中的数据进行操作。
$match
:查询条件
$group
:聚合的配置
_id
代表你想聚合的数据的主键,上述数据中,你想聚合所有cust_id
相同的条目的amount
的总和,那_id
即被设置为cust_id
。_id
为必须,你可以填写一个空值。total
代表你最后想输出的数据之一,这里total
是每条结果中amount
的总和。$sum
是一个聚合的操作符,另外的操作符你可以在官方文档中找到。上图中的命令表示对相同主键(_id)下的amount
进行求和。如果你想要计算主键出现的次数,可以把命令写成如下的形式{$sum: 1}
聚合的过程
看一下图例,所有的数据先经过$match
命令,只留下了status
为A的数据,接着,对筛选出的数据进行聚合操作,对相同cust_id的数据进行计算amount
总和的操作,最后输出结果。
2.aggregate具体介绍
$geoNear
geoNear命令可以在查询结果中返回每个点距离查询点的距离$group
指定 group 的_id
(key/keys) 和基于操作符($push
/$sum/$addToSet/
...) 的累加运算$limit
限制条件$match
输入过滤条件$out
将输出结果保存到collection
$project
修改数据流中的文档结构$redact
是$project
/$match
功能的合并$skip 跳过
$sort
对结果排序$unwind
拆解数据
$geoNear
geoNear命令可以在查询结果中返回每个点距离查询点的距离$group
指定 group 的_id
(key/keys) 和基于操作符($push
/$sum/$addToSet/
...) 的累加运算$limit
限制条件$match
输入过滤条件$out
将输出结果保存到collection
$project
修改数据流中的文档结构$redact
是$project
/$match
功能的合并$skip 跳过
$sort
对结果排序$unwind
拆解数据
$group
允许用的累加操作符 $addToSet
/$avg
/$first
/$last
/$max
/$min
/$push
/$sum,不被允许的累加操作符
$each... ,默认最多可以用 100MB RAM, 增加allowDiskUse
可以让$group
操作更多的数据
测试数据:
{ "_id" : ObjectId("5a2544352ba57ccba824d7bf"), "group" : "E", "created" : 1402764223, "count" : 63, "datetime" : 1512391126, "title" : "aa", "category" : "C8" } { "_id" : ObjectId("5a2544512ba57ccba824d7c0"), "group" : "I", "created" : 1413086660, "count" : 93, "datetime" : 1512391261, "title" : "bb", "category" : "C10" } { "_id" : ObjectId("5a2544562ba57ccba824d7c1"), "group" : "H", "created" : 1440750343, "count" : 41, "datetime" : 1512391111, "title" : "cc", "category" : "C1" } { "_id" : ObjectId("5a2544562ba57ccba824d7c2"), "group" : "S", "created" : 1437710373, "count" : 14, "datetime" : 1512392136, "title" : "dd", "category" : "C10" } { "_id" : ObjectId("5a2544562ba57ccba824d7c3"), "group" : "Z", "created" : 1428307315, "count" : 78, "datetime" : 1512391166, "title" : "ee", "category" : "C5" } { "_id" : ObjectId("5a2544562ba57ccba824d7c4"), "group" : "R", "created" : 1402809274, "count" : 74, "datetime" : 1512391162, "title" : "ff", "category" : "C9" } { "_id" : ObjectId("5a2544562ba57ccba824d7c5"), "group" : "Y", "created" : 1400571321, "count" : 66, "datetime" : 1512139164, "title" : "gg", "category" : "C2" } { "_id" : ObjectId("5a2544562ba57ccba824d7c6"), "group" : "L", "created" : 1416562128, "count" : 5, "datetime" : 1512393165, "title" : "hh", "category" : "C1" } { "_id" : ObjectId("5a2544562ba57ccba824d7c7"), "group" : "E", "created" : 1414057884, "count" : 12, "datetime" : 1512391165, "title" : "ii", "category" : "C3" } { "_id" : ObjectId("5a2544572ba57ccba824d7c8"), "group" : "L", "created" : 1418879346, "count" : 67, "datetime" : 1512391167, "title" : "gg", "category" : "C3" }
下面是aggregate的用法
db.newtest.aggregate([{$match: {}},{$skip: 10}, // 跳过 collection 的前 10 行{$project: {group: 1, datetime: 1, category: 1, count: 1}},// 1表示显示此字段,0则不显示{$redact: { // redact 简单用法 过滤 group != 'A' 的行$cond: [{$eq: ["$group", "A"]}, "$$DESCEND", "$$PRUNE"]}},{$group: {_id: {year: {$year: "$datetime"}, month: {$month: "$datetime"}, day: {$dayOfMonth: "$datetime"}},category_first: {$first: "$category"},category_last: {$last: "$category"},count_all: {$sum: "$count"},count_avg: {$avg: "$count"},rows: {$sum: 1}}},// 只保留这两个字段{$project: {group_unique: 1, rows: 1}},// 结果按照 _id 排序{$sort: {"_id": 1}},// 只保留 50 条结果// {$limit: 50},// 结果另存{$out: "data_agg_out"}, ], {allowDiskUse: true, //可选的。允许写入临时文件。设置为时true
,聚合操作可以将数据写入_tmp
目录中的dbPath
子目录 }) db.data_agg_out.find() db.data_agg_out.aggregate([{$group: {_id: null,rows: {$sum: '$rows'}}} ]) db.data_agg_out.drop()
转载于:https://www.cnblogs.com/Xuuuuuu/p/11265506.html
mongodb聚合查询-aggregate相关推荐
- MongoDB聚合查询 Pipeline 和 MapReduce
MongoDB聚合查询 MongoDB聚合查询 什么是聚合查询 Pipeline聚合管道方法 聚合流程 详细流程 聚合语法 常用聚合管道 $count $group $match $unwind $p ...
- MongoDB聚合查询
MongoDB高手课_MongoDB_NoSQL-极客时间极客时间推出的MongoDB高手课是帮助互联网从业者学习MongoDB.NoSQL的在线课程,极客时间是面向IT领域的知识服务产品,致力于帮助 ...
- MongoDB聚合(aggregate)常用操作及示例
简介 MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果. 有点类似 SQL 语句中的 count(*). 常用操作 表达式 描述 $mat ...
- Mongodb聚合框架Aggregate
一 概念 1.简介 mongo aggregation是mongo的一个轻量级的map-reduce框架,可以实现一些count,sum,group by的聚合. 使用聚合框架可以 ...
- Mongodb使用之Aggregation聚合查询:.group()/.project()/.and().previousOperation()等api的使用
最近在项目中遇到了Mongodb在聚合查询上的应用,在这里做一个记录. Spring Data MongoDB 中的聚合框架支持基于以下关键抽象:Aggregation.AggregationDefi ...
- Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)
阅读目录 一.Django ORM 常用字段和参数: 二.单表查询 三.多表查询 基于双下划线的多表查询 四.聚合查询和分组查询 摘要: 单表查询 多表查询 聚合查询 分组查询 一.Django OR ...
- 31.模型中的一些查询骚操作——模型中的聚合查询,Q查询,F查询,分组查询;
模型中的一些查询骚操作: (1)聚合查询:aggregate()是QuerySet 的一个终止子句,它返回一个包含一些键值对的字典 from movie.models import User from ...
- Day51python Django 多表操作 聚合查询、分组查询、F查询、Q查询
1聚合查询aggregate aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典,可以自己制定键. 1.# 计算所有图书的平均价格 books = mo ...
- day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询
day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询 昨日内容复习 自定义过滤器.标签.inclusion_tag 1.首先现在应用目录下创建名字为templatet ...
最新文章
- 某阿里程序员求助:绩效背1,老板让他主动走!敢要n+1就在背调时说坏话!怎么办?网友:大不了鱼死网破!...
- 独家 | 几个Jupyter笔记本的使用技巧
- 女性程序员占比超17%,平均月薪近2万 | 程序员就业大数据报告
- 解决用C#在visual studio编程中,console一闪而过
- oracle 不查加锁的记录,oracle 锁查询 select加锁方法
- SonarQube代码质量管理平台安装与使用--转载
- 区块链BaaS云服务(14)华大BGI区块链“碎片分布式存储“
- 创业第一站丨产品经理、海归转型成创业者有多难?
- hdu 3449(依赖背包)
- 台式电脑耳机插孔在哪_不到一千元的迷你电脑究竟如何?Intel NUC7CJYH测评来了...
- Django基于JWT实现微信小程序的登录和鉴权
- [CentOS] CentOS 6 IPv6 关闭方法
- squid 的配置详解 (转)--SeriesIV
- 企业级Ngnix基于域名的配置_server
- Java优雅的记录日志:log4j实战篇
- 在python中sqrt是什么意思_python中sqrt是什么意思
- 一维稳态导热的数值计算c语言,传热传质上机实习题(参考资料C语言)
- 简记_插件电阻功率选型及使用注意事项
- 暴涨彰显市场做多情绪
- ios html特殊字符转义字符,iOS URL 字符转义问题
热门文章
- 软件测试模型-敏捷模型
- 一阶电路误差分析_电动涡旋压缩机转子的模态分析及试验研究
- c语言过程化程序设计方法,程序的设计基础(C语言入门及编程环境)(修改).ppt
- php xml 实例教程,php解析xml方法实例详解,解析xml实例详解_PHP教程
- 10个JavaScript代码片段,帮助你成为更好的开发者
- 新手须知,前端该如何与后端合作?
- eclipse里source的快捷方法_教你如何在Linux中设置快捷方式图标
- system verilog编程题_拼多多2020校招部分算法编程题合集
- 学计算机和摄影哪个好,【干货】如何学习好摄影后期
- 实际开发的存储过程_实际生产中的 Android SDK开发总结| 完结