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. TeamX

    介绍 TeamX 是基于 SolonJT 平台构建的团队管理小工具,主要功能有: Wiki(团队词条,用于写MD格式接口文档也行...) Planned(项目计划 和 个人日志) Issues(问题管 ...

  2. 高效C++:设计与声明

    C++软件开发可以理解为设计一系列的类,让这些类相互使用,最终实现我们所需要的功能.类与类之间的相互关系可以很复杂,也可以很简单,如何简单高效的描述类与类之间的关系是设计的难点之一.遵循本文所提供的方 ...

  3. 从LocalDateTime序列化探讨全局一致性序列化

    日拱一卒无有尽,功不唐捐终入海. 楔子 前两周发了三篇SpringSecurity和一篇征文,这周打算写点简单有用易上手的文章,换换脑子,休息一下. 今天要写的是这篇:从LocalDateTime序列 ...

  4. 三面拿杭州研究院50offer:面对这些问题,你都能做到嘛??

    5G的到来证明了互联网行业发展一如既往的快,作为一名开发人员(Java岗)梦想自然是互联网行业的大厂,这次我的一个学员拿到了杭州的一个研究院offer,透露一下,年薪50多万,保底16,在这里分享一拨 ...

  5. BUUCTF-Web Comment

    dirsearch扫出/.git/目录 遂用航神写的Githacker脚本   https://github.com/wangyihang/githacker 出来的源码并不完整,使用git log ...

  6. linux虚拟机正常安装完成后获取不到IP的解决办法-网卡

    通常正常情况下安装完linux虚拟机,只需要使用桥接并修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,将如下参数值改为如下: ONBOOT=yes NM ...

  7. 人工智能?.netcore一样胜任!

    提起AI,大家都会先想到Python,确实Python作为一门好几十年的老语言,上一波的AI大流行使它焕发了青春.大家用Phtyon来做AI,最主要的原因无非就是编码量更少,很多数学和AI相关的Api ...

  8. PHP ftp_quit() 函数

    定义和用法 ftp_quit() 函数关闭 FTP 连接. 语法 ftp_quit(ftp_connection) 参数 描述 ftp_connection 必需.规定要关闭的 FTP 连接. 提示和 ...

  9. 2020牛客暑期多校训练营 第二场 I Interval 最大流 最小割 平面图对偶图转最短路

    LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完 ...

  10. 7.1 NOI模拟赛 计数问题 dp

    还是可以想出来的题目 不过考场上没有想出来 要 引以为戒. 初看觉得有点不可做 10分给到了爆搜. 考虑第一个特殊情况 B排列为1~m. 容易发现A排列中前m个数字 他们之间不能产生交换 且 第k个数 ...