1. 什么是MongoDB聚合框架

  1.1 MongoDB聚合框架(Aggregation Frameworn)是一个计算框架,它可以:

   ● 作用在一个或几个集合上

   ● 对集合中的数据进行一系列运算

   ● 将这些数据转化为期望的形式

  1.2 从效果而言,聚合框架相当于SQL查询中的:

   ● group by

   ● left outer join

   ● as 等

  1.3 整个聚合运算过程称为管道(Pipeline),它是由多个步骤(Stage)组成的,每个管道:

   ● 接受一些列文档(原始数据)

   ● 每个步骤对这些文档进行一系列运算

   ● 结果文档输出给下一个步骤

2. 使用聚合框架

  2.1 聚合运算的基本格式

pipeline = [$stage1,$stage2,...$stageN]

db.<集合>.aggregate(
pipeline,
{options}
)

  2.2 常见步骤

步骤 作用 SQL等价运算符
$match 过滤 where
$project 投影 as
$sort 排序 order by
$group 分组 group by
$skip / $limit 结果限制 skip / limit
$lookup 左外连接 left outer join
$unwind 展开数组 N/A
$graphLookup 图搜索 N/A
$facet/$bucket 分面搜索 N/A

  2.2 常见步骤中的运算符

$match $project $group

● $eq、$gt、$gte、$lt、$lte

● $and、$or、$not、$in

● $geoWithin、$intersect

......

● 选择需要的或排除不需要的字段

● $map、$reduce、$filter

● $range

● $multiply、$divide、$substract、$add

● $year、$month、$dayOfMonth、$hour、$minute、$second

......

● $esum、$avg

● $push、$addToSet

● $first、$last、$max、$min

......

3. 聚合运算的使用场景

  3.1 聚合查询可用于OLAP和ALTP场景,例如:

OLTP OLAP

● 计算

● 分析一段时间内的销售总额、均值

● 计算一段时间内的净利润

● 分析购买人的年龄分布

● 分析学生成绩分布

● 统计员工绩效

  3.1 MQL常用步骤与SQL对比

SQL MQL
select first_name as '名', last_name as '姓' from users
where gender='男'
skip 100
limit 20
db.users.aggregate([
{$match:{gender:'男'}},
{$skip:100},
{$limit:20},
{$project:{
'名':'$first_name',
'姓':'$last_name'
}}
])
select department,count(null) as emp_qty from users
where gender='女'
group by department having count(*)>10
db.users.aggregate([
{$match:{gender:'女'}},
{$group:{
_id:'$department',
emp_qty:{$sum:1}
}},
{$match:{emp_qty:{$le:10}}}
])
MQL特有 $unwind
// 现有如下数据
db.students.findOne()
{
name:"张三",
score:[
{subject:'语文',score:84},
{subject:'数学',score:80},
{subject:'英语',score:96},
]
} db.students.aggregate([
{$unwind:'$score'}
])
//结果如下
{name:'张三',score:{subject:'语文',score:84}}
{name:'张三',score:{subject:'数学',score:80}}
{name:'张三',score:{subject:'英语',score:96}}
MQL特有 $bucket

//常用语电商查询,查询价格在0-10 10-20 20-30 30-40 40-max之间的商品数量
db.products.aggregate([
{$bucket:{
groupBy:"$price",
boundaries:[0,10,20,30,40],
default:"Other",
output:{"count":{$sum:1}}
}}
])
MQL特有 $facet

//常用于电商查询,多个维度进行查询商品数量
db.products.aggregate([
{$facet:{
price:{
$bucket:{}
},
year:{
$bucket:{}
}
}}
])

MongoDB学习3:聚合查询的更多相关文章

  1. MongoDB学习笔记——聚合操作之MapReduce

    MapReduce MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,value) ...

  2. python操作mongodb之二聚合查询

    #聚合查询 from pymongo import MongoClient db = MongoClient('mongodb://10.0.0.9:27017/').aggregation_exam ...

  3. MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate

    一.MongoDB聚合管道(Aggregation Pilpeline) 使用聚合管道可以对集合中的文档进行变换和组合. 主要功能:表的关联查询.数据统计 二.aggregate 管道操作符与表达式 ...

  4. MongoDB学习笔记——聚合操作之聚合管道(Aggregation Pipeline)

    MongoDB聚合管道 使用聚合管道可以对集合中的文档进行变换和组合. 管道是由一个个功能节点组成的,这些节点用管道操作符来进行表示.聚合管道以一个集合中的所有文档作为开始,然后这些文档从一个操作节点 ...

  5. MongoDB学习笔记——聚合操作之group,distinct,count

    单独的聚合命令(group,distinct,count) 单独聚合命令 比aggregate性能低,比Map-reduce灵活度低:但是可以节省几行javascript代码,后面那句话我自己加的,哈 ...

  6. MongoDB学习笔记六—查询下

    查询内嵌文档 数据准备 > db.blog.find().pretty() { "_id" : ObjectId("585694e4c5b0525a48a441b5 ...

  7. MongoDB学习笔记五—查询上

    数据准备 { , "goods_name" : "KD876", "createTime" : ISODate("2016-12- ...

  8. MongoDB学习 (六):查询

    本文地址:http://www.cnblogs.com/egger/archive/2013/06/14/3135847.html  欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 本文将介绍操作符的使用 ...

  9. [转载]MongoDB学习 (六):查询

    本文地址:http://www.cnblogs.com/egger/archive/2013/06/14/3135847.html  欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 本文将介绍操作符的使用 ...

  10. mongodb学习(二)分级查询数组中的值

    (PS: 标题有点不妥当...) 大概是这样...数据结构如下: 需要模糊查询title的值... mongodb中操作语句: 主要是注意这里urlElements不需要加[0]...我开始的时候写成 ...

随机推荐

  1. Ethical Hacking - Web Penetration Testing(1)

    How to hack a website? An application installed on a computer. ->web application pen-testing A co ...

  2. P2060 马步距离(洛谷)

    我们无论遇到什么困难,都不要拖,微笑着面对他,战胜拖延的最好方法就是面对拖延. 今天又拖延了…… 早晨听完老师讲课,本想做一道题练练手的,结果因为懒,瘫了一上午.最后在固定的刷题时间去面对了这道题,然 ...

  3. mybatis generator 的日常使用

    一.mybatis-generator的基本配置与使用 使用mybatis-generator来生成常用的dao层类与xml,可以满足基础的增删改查功能 1. 添加pom依赖,常用的几个依赖包 < ...

  4. 题解 CF 1372 B

    题目 传送门 题意 给出 \(n\),输出 \(a\) ,\(b\) (\(0 < a \leq b < n\)),使\(a+b=n\)且 \(\operatorname{lcm}(a,b ...

  5. OKex平台如何使用谷歌身份验证?

    打开OK交易所官网,找到谷歌身份验证器的开启界面 登陆后点击右上角头像-账户和安全 然后[安全设置]里出现“谷歌验证”的位置,点击开启按钮,到了二维码和密钥显示的界面 我们不使用谷歌身份验证器,因为需 ...

  6. CentOS6下yum搭建LNMP环境

    1.关闭防火墙[root@CentOS ~]# chkconfig iptables off 2.关闭selinuxvi /etc/sysconfig/selinux //将SELINUX=enfor ...

  7. JVM 学习笔记记录

    JVM 学习笔记记录 Sun JDK 监控和故障处理工具 名称 主要作用 jps JVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程 jstat JVM S ...

  8. luogu P4726 【模板】多项式指数函数 多项式 exp 牛顿迭代 泰勒展开

    LINK:多项式 exp 做多项式的题 简直在嗑药. 前置只是 泰勒展开 这个东西用于 对于一个函数f(x) 我们不好得到 其在x处的取值. 所以另外设一个函数g(x) 来在x点处无限逼近f(x). ...

  9. 2019 HL SC day1

    今天讲的是图论大体上分为:有向图的强连通分量,有向图的完全图:竞赛图,无向图的的割点,割边,点双联通分量,变双联通分量以及圆方树 2-sat问题 支配树等等. 大体上都知道是些什么东西 但是仍需要写一 ...

  10. 10分钟了解js的宏任务和微任务

    熟悉宏任务和微任务以及js(nodejs)事件循环机制,在写业务代码还是自己写库,或者看源码都是那么重要 看了部分文档,自己总结和实践了一下 js中同步任务.宏任务和微任务介绍 同步任务: 普通任务 ...