MongoDB学习3:聚合查询

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场景,例如:

OLTPOLAP

● 计算

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

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

● 分析购买人的年龄分布

● 分析学生成绩分布

● 统计员工绩效

  3.1 MQL常用步骤与SQL对比

SQLMQL
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:{}
    }
  }}
])
posted @ 2020-08-03 22:59  等一个,晴天  阅读(253)  评论(0编辑  收藏  举报