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" : , "count" : , "datetime" : , "title" : "aa", "category" : "C8" }
{ "_id" : ObjectId("5a2544512ba57ccba824d7c0"), "group" : "I", "created" : , "count" : , "datetime" : , "title" : "bb", "category" : "C10" }
{ "_id" : ObjectId("5a2544562ba57ccba824d7c1"), "group" : "H", "created" : , "count" : , "datetime" : , "title" : "cc", "category" : "C1" }
{ "_id" : ObjectId("5a2544562ba57ccba824d7c2"), "group" : "S", "created" : , "count" : , "datetime" : , "title" : "dd", "category" : "C10" }
{ "_id" : ObjectId("5a2544562ba57ccba824d7c3"), "group" : "Z", "created" : , "count" : , "datetime" : , "title" : "ee", "category" : "C5" }
{ "_id" : ObjectId("5a2544562ba57ccba824d7c4"), "group" : "R", "created" : , "count" : , "datetime" : , "title" : "ff", "category" : "C9" }
{ "_id" : ObjectId("5a2544562ba57ccba824d7c5"), "group" : "Y", "created" : , "count" : , "datetime" : , "title" : "gg", "category" : "C2" }
{ "_id" : ObjectId("5a2544562ba57ccba824d7c6"), "group" : "L", "created" : , "count" : , "datetime" : , "title" : "hh", "category" : "C1" }
{ "_id" : ObjectId("5a2544562ba57ccba824d7c7"), "group" : "E", "created" : , "count" : , "datetime" : , "title" : "ii", "category" : "C3" }
{ "_id" : ObjectId("5a2544572ba57ccba824d7c8"), "group" : "L", "created" : , "count" : , "datetime" : , "title" : "gg", "category" : "C3" }

下面是aggregate的用法

db.newtest.aggregate([
{$match: {}},
{$skip: }, // 跳过 collection 的前 10 行
{$project: {group: , datetime: , category: , count: }},
// 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: }
}},// 只保留这两个字段
{$project: {group_unique: , rows: }},
// 结果按照 _id 排序
{$sort: {"_id": }},
// 只保留 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()

mongodb聚合查询-aggregate的更多相关文章

  1. MongoDB聚合查询及Python连接MongoDB操作

    今日内容概要 聚合查询 Python操作MongoDB 第三方可视化视图工具 今日内容详细 聚合查询 Python操作MongoDB 数据准备 from pymongo import MongoCli ...

  2. MongoDB 聚合查询报错

    1.Distinct聚合查询报错 db.users.distinct("uname") db.runCommand({"distinct":"user ...

  3. mongodb 聚合查询

    操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的字段排序结 ...

  4. 记一次mongodb聚合查询

    先说一下场景,产品中用到了简单的表单构造器,开始提供了一系列的控件,例如单行文本框.多行文本框.单选.复选.时间等,之后你可以拖拽控件自己组装你想要的表单……网上有很多的表单构造器,这里就不细说了,可 ...

  5. MongoDB聚合查询

    1.count:查询记录条数 db.user.count() 它也跟find一样可以有条件的 db.user.count({}) 2.distinct:用来找出给定键的所有不同的值 db.user.d ...

  6. 【Mongodb】聚合查询 && 固定集合

    概述 数据存储是为了可查询,统计.若数据只需存储,不需要查询,这种数据也没有多大价值 本篇介绍Mongodb 聚合查询(Aggregation) 固定集合(Capped Collections) 准备 ...

  7. Mongodb高级查询【二】

    上一篇文章,写了mongodb常规操作,继续写入,本章主要讲高级查询,文本,聚集,大数据查询. Mongodb的查询语法是很多的,是NOSQL队伍中比较丰富的一个.当然有很多查询跟关系型查询无法相比. ...

  8. django系列5.5--分组查询,聚合查询,F查询,Q查询,脚本中调用django环境

    一.聚合查询 aggregate(*args, **args) 先引入需要的包,再使用聚合查询 #计算所有图书的平均价格 from django.db.models import Avg Book.o ...

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

    摘要: 单表查询 多表查询 聚合查询 分组查询 一.Django ORM 常用字段和参数: 常用字段:#AutoFieldint自增列,必须填入参数primary_key = True,当model中 ...

随机推荐

  1. VM12_pro+Ubuntu16_64+Qt5.12.2环境搭建

    1.准备软件[已经存网盘] 2.安装Vm 3.安装Ubuntu 4.进入linux,修改Qt安装包权限 5.运行Qt 6.第五步会弹出Qt安装的界面,默认安装就行了 7.修改环境变量 sudo ged ...

  2. jquery图片播放插件Fancybox使用详解

    今天给大家介绍的jquery图片播放插件叫Fancybox,相比LightBox来说,Fancybox相对庞大点,配置也更丰富一些,相信你会喜欢的. Fancybox的项目主页地址:http://fa ...

  3. Asp.net C# 遍历Excel中的表格名称

    Asp.net C# 遍历Excel中的表格名称     string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + " ...

  4. 理解ADFS相关概念

    核心概念 Claims是?Token是?Security Token是?Security Token Server (STS)是? 声明与令牌无关,但通过封装在安全令牌中来进行网络传输! SSL证书是 ...

  5. Egret入门学习日记 --- 第十六篇(书中 6.10~7.3节 内容)

    第十六篇(书中 6.10~7.3节 内容) 昨天搞定了6.9节,今天就从6.10节开始. 其实这个蛮简单的. 这是程序员模式. 这是设计师模式. 至此,6.10节 完毕. 开始 6.11节. 有点没营 ...

  6. 微信H5支付开发全过程(除内置微信以外的浏览器)

    前言:网上都是~ 呵呵 自己搞 只要花时间 多问客服总会有的 只说程序不说准备工作 自己ID 或者秘钥都准备好了  写的有点儿乱 可以把所有的方法 放在一个文件中调用 public function ...

  7. 软件测试开发人员需要掌握的一些基本数据结构算法(php编写)

    一:冒泡排序算法    冒泡排序(Bubble Sort)算法是一种典型的交换排序算法,通过两两数据交换进行排序.如果有n个数,则要进行n-1趟比较,在第1趟比较中要进行n-1次两两比较,在第j趟比较 ...

  8. C语言程序设计II—第十二周教学

    第十二周教学总结(13/5-19/5) 教学内容 本周的教学内容为:11.1 知识点:指针数组的概念.11.2 知识点:函数指针.11.3知识点:单链表的基本概念,链表节点的结构定义方法,以及单向链表 ...

  9. EMR的fair-scheduler.xml

    cat /etc/ecm/hadoop-conf/fair-scheduler.xml <?xml version="1.0"?> <allocations> ...

  10. Python【BeautifulSoup解析和提取网页数据】

    [解析数据] 使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子 在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据 [提取数据]是指把我们需要的数据从众多数据中挑 ...