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. StringBuilder和 String的区别?

    String在进行运算时(如赋值.拼接等)会产生一个新的实例,而 StringBuilder则不会.所以在大 量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 S ...

  2. ReentrantLock以及AQS实现原理

    什么是可重入锁? ReentrantLock是可重入锁,什么是可重入锁呢?可重入锁就是当前持有该锁的线程能够多次获取该锁,无需等待.可重入锁是如何实现的呢?这要从ReentrantLock的一个内部类 ...

  3. 【Unity3D】简单常用的功能实现2——视角的跟随、旋转、缩放

    [视角的跟随.旋转.缩放实现] 首先,在实现这些功能之前,我们给Hierarchy面板中的主摄像机额外包装几层Empty Object,形成一个新的摄像机结构,如下图(当然这些空物体的命名大家按自己方 ...

  4. Nginx配置中文参数说明

    #定义Nginx运行的用户和用户组 user www www; # #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; # #全局错误日志定义类型,[ debu ...

  5. 痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...

  6. 读懂操作系统之快表(TLB)原理(七)

    前言 前不久.我们详细分析了TLB基本原理,本节我们通过一个简单的示例再次叙述TLB的算法和原理,希望借此示例能加深我们对TLB(又称之为快表,深入理解计算机系统(第三版)又称之为翻译后备缓冲区)的理 ...

  7. python学习之路------你想要的都在这里了

    python学习之路------你想要的都在这里了 (根据自己的学习进度后期不断更新哟!!!) 一.python基础 1.python基础--python基本知识.七大数据类型等 2.python基础 ...

  8. 【高并发】亿级流量场景下如何为HTTP接口限流?看完我懂了!!

    写在前面 在互联网应用中,高并发系统会面临一个重大的挑战,那就是大量流高并发访问,比如:天猫的双十一.京东618.秒杀.抢购促销等,这些都是典型的大流量高并发场景.关于秒杀,小伙伴们可以参见我的另一篇 ...

  9. PHP array_diff_assoc() 函数

    实例 比较两个数组的键名和键值,并返回差集: <?php$a1=array("a"=>"red","b"=>"g ...

  10. Python File tell() 方法

    概述 tell() 方法返回文件的当前位置,即文件指针当前位置.高佣联盟 www.cgewang.com 语法 tell() 方法语法如下: fileObject.tell() 参数 无 返回值 返回 ...