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 - NETWORK PENETRATION TESTING(1)

    Pre--Connection-Attacks that can be done before connecting to the network. Gaining Access - How to b ...

  2. EF中延迟加载的那些事

    延迟加载又称懒加载,通俗一点就是关联了一个对象,不用的时候不去查这个对象,当调用的时候再组织sql去查出这个对象的相关内容. 一.在使用EF时,我们会发现借助于框架生成的实体类中的的导航属性通常是标记 ...

  3. antd踩坑:日期选择器的可选日期控制的问题

    有一个需求是日期选择需要加一个日期限制. 于是我兴高采烈的加上去了. // 日期可选判断方法 disabledDateFunc = current => { const { disabledDa ...

  4. day12:闭包函数&匿名函数

    闭包函数 闭包函数的定义: 如果内函数使用了外函数的局部变量并且外函数把内函数返回出来的过程 叫做闭包里面的内函数是闭包函数 一个简单的闭包函数示例: def songyunjie_family(): ...

  5. webpack的使用 一、webpack 和webpack的安装

    本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时, 它会递归地构建一个依赖关系图(dependen ...

  6. 面试题四十二:连续子数组的最大和,要求时间复杂度为 n

    方法一:举例分析数组的规律,累加数组逐步保存最大值:累加中和<0,则遗弃前面的累加和:重新开始: int FindMaxArray(int [] A) {               if(A= ...

  7. GridMask:一种数据增强方法

    GridMask Data Augmentation, ARXIV 2020 代码地址:https://github.com/akuxcw/GridMask 这篇论文提出了一种简单的数据增强方法,在图 ...

  8. $0.\dot{9}=1,是指以1为极限,而非初等数学的相等“=”$

    $注:文中的讨论,没有使用严格的 \epsilon 极限定义,而是简单假设$ 按照中小学的定义,整数,有限小数,无限循环小数是有理数.无限不循环小数是无理数. $\frac{1}{3}=0.\dot{ ...

  9. JAVA OOP 编程-常用设计模式

    smart-design-pattern 吼吼!10分钟内快速回顾所有设计模式及应用场景 其实,工作三年以上,精通coding,深知并发编程,熟悉OOP思想,但却因为种种原因! 没有在学习生涯初期就看 ...

  10. Centos 安装ixgbe驱动

    1. 首先查看网卡类型 [root]# lspci | grep 8259907:00.0 Ethernet controller: Intel Corporation 82599ES 10-Giga ...