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相关推荐

  1. MongoDB聚合查询 Pipeline 和 MapReduce

    MongoDB聚合查询 MongoDB聚合查询 什么是聚合查询 Pipeline聚合管道方法 聚合流程 详细流程 聚合语法 常用聚合管道 $count $group $match $unwind $p ...

  2. MongoDB聚合查询

    MongoDB高手课_MongoDB_NoSQL-极客时间极客时间推出的MongoDB高手课是帮助互联网从业者学习MongoDB.NoSQL的在线课程,极客时间是面向IT领域的知识服务产品,致力于帮助 ...

  3. MongoDB聚合(aggregate)常用操作及示例

    简介 MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果. 有点类似 SQL 语句中的 count(*). 常用操作 表达式 描述 $mat ...

  4. Mongodb聚合框架Aggregate

    一 概念   1.简介     mongo aggregation是mongo的一个轻量级的map-reduce框架,可以实现一些count,sum,group by的聚合.     使用聚合框架可以 ...

  5. Mongodb使用之Aggregation聚合查询:.group()/.project()/.and().previousOperation()等api的使用

    最近在项目中遇到了Mongodb在聚合查询上的应用,在这里做一个记录. Spring Data MongoDB 中的聚合框架支持基于以下关键抽象:Aggregation.AggregationDefi ...

  6. Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)

    阅读目录 一.Django ORM 常用字段和参数: 二.单表查询 三.多表查询 基于双下划线的多表查询 四.聚合查询和分组查询 摘要: 单表查询 多表查询 聚合查询 分组查询 一.Django OR ...

  7. 31.模型中的一些查询骚操作——模型中的聚合查询,Q查询,F查询,分组查询;

    模型中的一些查询骚操作: (1)聚合查询:aggregate()是QuerySet 的一个终止子句,它返回一个包含一些键值对的字典 from movie.models import User from ...

  8. Day51python Django 多表操作 聚合查询、分组查询、F查询、Q查询

    1聚合查询aggregate aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典,可以自己制定键. 1.# 计算所有图书的平均价格 books = mo ...

  9. day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询

    day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询 昨日内容复习 自定义过滤器.标签.inclusion_tag 1.首先现在应用目录下创建名字为templatet ...

最新文章

  1. 某阿里程序员求助:绩效背1,老板让他主动走!敢要n+1就在背调时说坏话!怎么办?网友:大不了鱼死网破!...
  2. 独家 | 几个Jupyter笔记本的使用技巧
  3. 女性程序员占比超17%,平均月薪近2万 | 程序员就业大数据报告
  4. 解决用C#在visual studio编程中,console一闪而过
  5. oracle 不查加锁的记录,oracle 锁查询 select加锁方法
  6. SonarQube代码质量管理平台安装与使用--转载
  7. 区块链BaaS云服务(14)华大BGI区块链“碎片分布式存储“
  8. 创业第一站丨产品经理、海归转型成创业者有多难?
  9. hdu 3449(依赖背包)
  10. 台式电脑耳机插孔在哪_不到一千元的迷你电脑究竟如何?Intel NUC7CJYH测评来了...
  11. Django基于JWT实现微信小程序的登录和鉴权
  12. [CentOS] CentOS 6 IPv6 关闭方法
  13. squid 的配置详解 (转)--SeriesIV
  14. 企业级Ngnix基于域名的配置_server
  15. Java优雅的记录日志:log4j实战篇
  16. 在python中sqrt是什么意思_python中sqrt是什么意思
  17. 一维稳态导热的数值计算c语言,传热传质上机实习题(参考资料C语言)
  18. 简记_插件电阻功率选型及使用注意事项
  19. 暴涨彰显市场做多情绪
  20. ios html特殊字符转义字符,iOS URL 字符转义问题

热门文章

  1. 软件测试模型-敏捷模型
  2. 一阶电路误差分析_电动涡旋压缩机转子的模态分析及试验研究
  3. c语言过程化程序设计方法,程序的设计基础(C语言入门及编程环境)(修改).ppt
  4. php xml 实例教程,php解析xml方法实例详解,解析xml实例详解_PHP教程
  5. 10个JavaScript代码片段,帮助你成为更好的开发者
  6. 新手须知,前端该如何与后端合作?
  7. eclipse里source的快捷方法_教你如何在Linux中设置快捷方式图标
  8. system verilog编程题_拼多多2020校招部分算法编程题合集
  9. 学计算机和摄影哪个好,【干货】如何学习好摄影后期
  10. 实际开发的存储过程_实际生产中的 Android SDK开发总结| 完结