聚合框架

1. 是一个计算框架

  • 作用在一个or几个集合上
  • 对集合中的数据进行一系列运算
  • 将这些数据转化为期望的形式

    2. 类比SQL查询

  • 从效果而言,类似SQL中的

    • group by
    • left outer join
    • as

管道(Pipeline)和步骤(Stage)

1. 管道和步骤

  • 整个聚合运算的过程称为管道,它是由多个步骤组成的
  • 每个管道:
    • 接受一系列文档(原始数据)
    • 每个步骤对这些文档进行一系列运算
    • 结果文档输出给下一个步骤
      image.png

2. 聚合运算的基本格式

  1. pipeline = [$stage1(JSON格式), $stage2, ..., $stageN];
  2. db.collection.aggregate(
  3. pipline,
  4. {options}
  5. )

3. 常见步骤image.png

4. 常见步骤里的运算符image.png

5. 一些不常用的步骤image.png

聚合运算的使用场景

1. OLAP和OLTP场景image.png

2. MQL常用步骤与SQL对比

  • 案例1:
    image.png

  • 案例2:
    image.png

  • MQL特有步骤$unwind,用于展开数组
    image.png

  • MQL特有步骤$bucket,用于分组。电商、产品统计场景十分合适
    image.png

  • MQL特有步骤$facet,将bucket组合起来。适合多维度指标的统计

image.png

  • 一个案例:查看2019年第一季度已完成订单订单总金额和订单总数
  1. db.getCollection('orders').aggregate([
  2. // 步骤1:匹配条件
  3. {
  4. $match: {
  5. status: "completed",
  6. orderDate: {
  7. $gte: ISODate("2019-01-01"),
  8. $lt: ISODate("2019-04-01")
  9. }
  10. }
  11. },
  12. // 步骤2:聚合订单总金额、运费、总数量
  13. {
  14. $group: {
  15. _id: null,
  16. total: {$sum: "$total"},
  17. shippingFee: {$sum: "$shippingFee"},
  18. count: {$sum: 1}
  19. }
  20. },
  21. // 步骤3:计算总金额
  22. {
  23. $project: {
  24. grandTotal: {$add: ["$total", "$shippingFee"]},
  25. count: 1,
  26. _id: 0
  27. }
  28. }
  29. ])
  30. // 结果
  31. // {"count": ..., "grandTotal": ...(如:NumberDecimal("3243243424.33"))}