当前位置: 首页 > article >正文

MongoDB 聚合管道

参考: 聚合管道 - MongoDB 手册 v7.0

介绍

聚合管道由一个或多个处理文档的阶段组成:

  • 每个阶段对输入文档执行一个操作。例如,某个阶段可以过滤文档、对文档进行分组并计算值。

  • 从一个阶段输出的文档将传递到下一阶段。

  • 一个聚合管道可以返回针对文档组的结果。例如,返回总值、平均值、最大值和最小值。

如使用通过聚合管道更新中显示的阶段,则可以通过聚合管道更新文档。

其实也就类似于 MYSQL 的函数的功能

具体功能实现

先导入一部分数据

db.orders.insertMany( [
   { _id: 0, name: "Pepperoni", size: "small", price: 19,
     quantity: 10, date: ISODate( "2021-03-13T08:14:30Z" ) },
   { _id: 1, name: "Pepperoni", size: "medium", price: 20,
     quantity: 20, date : ISODate( "2021-03-13T09:13:24Z" ) },
   { _id: 2, name: "Pepperoni", size: "large", price: 21,
     quantity: 30, date : ISODate( "2021-03-17T09:22:12Z" ) },
   { _id: 3, name: "Cheese", size: "small", price: 12,
     quantity: 15, date : ISODate( "2021-03-13T11:21:39.736Z" ) },
   { _id: 4, name: "Cheese", size: "medium", price: 13,
     quantity:50, date : ISODate( "2022-01-12T21:23:13.331Z" ) },
   { _id: 5, name: "Cheese", size: "large", price: 14,
     quantity: 10, date : ISODate( "2022-01-12T05:08:13Z" ) },
   { _id: 6, name: "Vegan", size: "small", price: 17,
     quantity: 10, date : ISODate( "2021-01-13T05:08:13Z" ) },
   { _id: 7, name: "Vegan", size: "medium", price: 18,
     quantity: 10, date : ISODate( "2021-01-13T05:10:13Z" ) }
] )

计算总订单数量

以下聚合管道示例包含两个阶段,并返回按披萨名称分组后,各款中号披萨的总订单数量:

db.orders.aggregate( [

   // Stage 1: Filter pizza order documents by pizza size
   {
      $match: { size: "medium" }
   },

   // Stage 2: Group remaining documents by pizza name and calculate total quantity
   {
      $group: { _id: "$name", totalQuantity: { $sum: "$quantity" } }
   }

] )

$match 阶段:

  • 从披萨订单文档过滤出size为medium的披萨。
  • 将剩余文档传递到$group阶段。

$group 阶段:

  • 按披萨name对剩余文档进行分组。
  • 使用$sum计算每种披萨name的总订单quantity。总数存储在聚合管道返回的totalQuantity字段中。

示例输出:

[
   { _id: 'Cheese', totalQuantity: 50 },
   { _id: 'Vegan', totalQuantity: 10 },
   { _id: 'Pepperoni', totalQuantity: 20 }
]

计算订单总值和平均订单数

以下示例计算了两个日期之间的披萨订单总额和平均订单数量:

db.orders.aggregate( [

   // Stage 1: Filter pizza order documents by date range
   {
      $match:
      {
         "date": { $gte: new ISODate( "2020-01-30" ), $lt: new ISODate( "2022-01-30" ) }
      }
   },

   // Stage 2: Group remaining documents by date and calculate results
   {
      $group:
      {
         _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
         totalOrderValue: { $sum: { $multiply: [ "$price", "$quantity" ] } },
         averageOrderQuantity: { $avg: "$quantity" }
      }
   },

   // Stage 3: Sort documents by totalOrderValue in descending order
   {
      $sort: { totalOrderValue: -1 }
   }

 ] )

$match 阶段:

  • 使用 $gte 和 $lt 将披萨订单文档筛选为指定日期范围内的文档。
  • 将剩余文档传递到$group阶段。

$group 阶段:

  • 使用 $dateToString 按日期对文档进行分组。

  • 对于每个群组,计算:

    • 使用 $sum 和 $multiply 的总订单值。

    • 使用 $avg 计算平均订单数量。

  • 将分组的文档传递到 $sort 阶段。

$sort 阶段:

  • 按每组的总订单值以降序对文档进行排序 ( -1 )。
  • 返回排序文档。

示例输出:

[
   { _id: '2022-01-12', totalOrderValue: 790, averageOrderQuantity: 30 },
   { _id: '2021-03-13', totalOrderValue: 770, averageOrderQuantity: 15 },
   { _id: '2021-03-17', totalOrderValue: 630, averageOrderQuantity: 30 },
   { _id: '2021-01-13', totalOrderValue: 350, averageOrderQuantity: 10 }
]

http://www.kler.cn/a/329244.html

相关文章:

  • Python去除图像白色背景
  • 【leetcode 02】27. 移除元素
  • 博客文章怎么设计分类与标签
  • Vue3 pinia使用
  • 纯前端实现语音文字互转
  • 15-大模型 RAG 经验篇
  • Springboot3 + MyBatis-Plus + MySql + Vue + ProTable + TS 实现后台管理商品分类(最新教程附源码)
  • Webpack和GuIp打包原理以及不同
  • IDM下载器如何下载网盘文件 IDM下载器支持哪些网盘
  • 【数据库】Java 集成mongodb— MongoTemplate 详解
  • OpenCV图像文件读写(6)将图像数据写入文件的函数imwrite()的使用
  • YOLO11改进|卷积篇|引入可变核卷积AKConv
  • 程序计数器(学习笔记)
  • Docker 进入容器运行命令的详细指南
  • “图像识别技术:重塑生活与工作的未来”
  • Linux:编译,调试和Makefile
  • Spring MVC系统学习(一)——初识Spring MVC框架
  • AIGAME平台的由来与未来展望 —— 蒙特加密基金推动区块链与AI融合创新
  • Redis篇(应用案例 - 短信登录)(持续更新迭代)
  • GEE教程:利用sentinel-2数据和NDVI指数监测火灾
  • Ansible实现剧本远程服务器创建、删除用户
  • SpringGateway(网关)微服务
  • MDM监管锁系统上锁流程
  • Redis 中 String 命令的基础操作
  • 【CKA】一、基于角色的访问控制-RBAC
  • 【分布式微服务云原生】消息队列全解析:原理、应用场景与主流MQ对比