zoukankan      html  css  js  c++  java
  • 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:{}
        }
      }}
    ])
    
  • 相关阅读:
    sql优化
    一些有用的单词(1)
    用到的 Sed 注解
    终端工具注册码
    nginx四层、七层负载均衡配置示例
    http 状态码
    04. Golang 数据类型
    03. Golang 特性
    02. Go 命令
    01. GOPATH 目录结构划分的两种风格
  • 原文地址:https://www.cnblogs.com/xiaoqingtian/p/13430517.html
Copyright © 2011-2022 走看看