Mongodb SQL 到聚合映射快速参考

SQL 映射

聚合管道允许MongoDB 提供原生聚合功能,对应于 SQL 中许多常见的数据聚合操作。比如:GROUP BY、COUNT()、UNION ALL

测试数据

For MySQL

root@localhost 14:40:40 [test]> select * from orders; 
+-----+---------+---------------------+-------+--------+
| _id | cust_id | ord_date            | price | status |
+-----+---------+---------------------+-------+--------+
|   1 | A       | 2023-06-01 00:00:00 |    15 |      1 |
|   2 | A       | 2023-06-08 00:00:00 |    60 |      1 |
|   3 | B       | 2023-06-08 00:00:00 |    55 |      1 |
|   4 | B       | 2023-06-18 00:00:00 |    26 |      1 |
|   5 | B       | 2023-06-19 00:00:00 |    40 |      1 |
|   6 | C       | 2023-06-19 00:00:00 |    38 |      1 |
|   7 | C       | 2023-06-20 00:00:00 |    21 |      1 |
|   8 | D       | 2023-06-20 00:00:00 |    76 |      1 |
|   9 | D       | 2023-06-20 00:00:00 |    51 |      1 |
|  10 | D       | 2023-06-23 00:00:00 |    23 |      1 |
+-----+---------+---------------------+-------+--------+
10 rows in set (0.00 sec)root@localhost 14:41:19 [test]> select * from orders_item; 
+-----+----------+---------+-----+-------+
| _id | order_id | sku     | qty | price |
+-----+----------+---------+-----+-------+
|   1 |        4 | apple   |  10 |   2.5 |
|   2 |        6 | carrots |  10 |     1 |
|   3 |        6 | apples  |  10 |   2.5 |
|   4 |        1 | apple   |   5 |   2.5 |
|   5 |        1 | apples  |   5 |   2.5 |
|   6 |        2 | apple   |   8 |   2.5 |
|   7 |        2 | banana  |   5 |    10 |
|   8 |        9 | carrots |   5 |     1 |
|   9 |        9 | apples  |  10 |   2.5 |
|  10 |        9 | apple   |  10 |   2.5 |
|  11 |        3 | apple   |  10 |   2.5 |
|  12 |        3 | pears   |  10 |   2.5 |
|  13 |        5 | banana  |   5 |    10 |
|  14 |        7 | apple   |  10 |   2.5 |
|  15 |        8 | banana  |   5 |    10 |
|  16 |        8 | apples  |  10 |   2.5 |
|  17 |       10 | apple   |  10 |   2.5 |
+-----+----------+---------+-----+-------+
17 rows in set (0.01 sec)

For Mongodb :

sit_rs1:PRIMARY> db.orders.find().sort({"_id": 1}); 
{ "_id" : 1, "cust_id" : "A", "ord_date" : ISODate("2023-06-01T00:00:00Z"), "price" : 15, "items" : [ { "sku" : "apple", "qty" : 5, "price" : 2.5 }, { "sku" : "apples", "qty" : 5, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 2, "cust_id" : "A", "ord_date" : ISODate("2023-06-08T00:00:00Z"), "price" : 60, "items" : [ { "sku" : "apple", "qty" : 8, "price" : 2.5 }, { "sku" : "banana", "qty" : 5, "price" : 10 } ], "status" : "1" }
{ "_id" : 3, "cust_id" : "B", "ord_date" : ISODate("2023-06-08T00:00:00Z"), "price" : 55, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 }, { "sku" : "pears", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 4, "cust_id" : "B", "ord_date" : ISODate("2023-06-18T00:00:00Z"), "price" : 26, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 5, "cust_id" : "B", "ord_date" : ISODate("2023-06-19T00:00:00Z"), "price" : 40, "items" : [ { "sku" : "banana", "qty" : 5, "price" : 10 } ], "status" : "1" }
{ "_id" : 6, "cust_id" : "C", "ord_date" : ISODate("2023-06-19T00:00:00Z"), "price" : 38, "items" : [ { "sku" : "carrots", "qty" : 10, "price" : 1 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 7, "cust_id" : "C", "ord_date" : ISODate("2023-06-20T00:00:00Z"), "price" : 21, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 8, "cust_id" : "D", "ord_date" : ISODate("2023-06-20T00:00:00Z"), "price" : 76, "items" : [ { "sku" : "banana", "qty" : 5, "price" : 10 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 9, "cust_id" : "D", "ord_date" : ISODate("2023-06-20T00:00:00Z"), "price" : 51, "items" : [ { "sku" : "carrots", "qty" : 5, "price" : 1 }, { "sku" : "apples", "qty" : 10, "price" : 2.5 }, { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }
{ "_id" : 10, "cust_id" : "D", "ord_date" : ISODate("2023-06-23T00:00:00Z"), "price" : 23, "items" : [ { "sku" : "apple", "qty" : 10, "price" : 2.5 } ], "status" : "1" }

示例一:客户订单统计

按客户分组,统计每个客户订单数量,并计算订单总价格,按价格从高到低排序。 可以使用聚合管道的方式,如下:

$group

  • 按指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个组。消耗所有输入文档并为每个不同组输出一个文档。输出文档仅包含标识符字段和累积字段(如果指定)。

$sort

  • 按指定的排序键对文档流重新排序。仅顺序发生变化;文件保持不变。对于每个输入文档,输出一个文档。

SQL 示例:

root@localhost 14:41:26 [test]> SELECT cust_id, count(*), SUM(price) AS total FROM orders GROUP BY cust_id order by total desc; 
+---------+----------+-------+
| cust_id | count(*) | total |
+---------+----------+-------+
| D       |        3 |   150 |
| B       |        3 |   121 |
| A       |        2 |    75 |
| C       |        2 |    59 |
+---------+----------+-------+
4 rows in set (0.00 sec)

MongoDB 示例:

sit_rs1:PRIMARY> db.orders.aggregate( 
... [
...    { $group: { _id: "$cust_id", count: { $sum: 1 }, total: { $sum: "$price" } } }, 
...    { $sort: { total: -1 } }
... ] 
... )
{ "_id" : "D", "count" : 3, "total" : 150 }
{ "_id" : "B", "count" : 3, "total" : 121 }
{ "_id" : "A", "count" : 2, "total" : 75 }
{ "_id" : "C", "count" : 2, "total" : 59 }

示例二:日期订单统计

对于每个唯一的cust_id 按 cust_id、ord_date 分组 ,对price字段求和并仅在总和大于 30时返回。不包括日期的时间部分。

$group

  • 按指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个组。消耗所有输入文档并为每个不同组输出一个文档。输出文档仅包含标识符字段和累积字段(如果指定)。

$match

  • 过滤文档流以仅允许匹配的文档未经修改地传递到下一个管道阶段。 $match使用标准 MongoDB 查询。对于每个输入文档,输出一个文档(匹配)或零个文档(不匹配)。

$sort

  • 按指定的排序键对文档流重新排序。仅顺序发生变化;文件保持不变。对于每个输入文档,输出一个文档。

SQL 示例:

root@localhost 14:42:51 [test]> SELECT cust_id, DATE(ord_date),  SUM(price) AS total FROM orders GROUP BY cust_id, DATE(ord_date) HAVING total > 30 order by total desc;
+---------+----------------+-------+
| cust_id | DATE(ord_date) | total |
+---------+----------------+-------+
| D       | 2023-06-20     |   127 |
| A       | 2023-06-08     |    60 |
| B       | 2023-06-08     |    55 |
| B       | 2023-06-19     |    40 |
| C       | 2023-06-19     |    38 |
+---------+----------------+-------+
5 rows in set (0.00 sec)

MongoDB 示例:

sit_rs1:PRIMARY> db.orders.aggregate( 
... [
...    { $group: { _id: { cust_id: "$cust_id",  ord_date: { $dateToString: {  format: "%Y-%m-%d",   date: "$ord_date"  } } }, total: { $sum: "$price" } } },
...    { $match: { total: { $gt: 30 } } },
...    { $sort: { total: -1 } }
... 
... ] 
... )
{ "_id" : { "cust_id" : "D", "ord_date" : "2023-06-20" }, "total" : 127 }
{ "_id" : { "cust_id" : "A", "ord_date" : "2023-06-08" }, "total" : 60 }
{ "_id" : { "cust_id" : "B", "ord_date" : "2023-06-08" }, "total" : 55 }
{ "_id" : { "cust_id" : "B", "ord_date" : "2023-06-19" }, "total" : 40 }
{ "_id" : { "cust_id" : "C", "ord_date" : "2023-06-19" }, "total" : 38 }

示例三:SKU商品统计

对于每个唯一的cust_id 按 用户分组 ,对 items 数组字段进行分解,统计每个用户的 SKU 总数量,如下:

$unwind

  • 从输入文档解构数组字段以输出每个元素的文档。每个输出文档都用一个元素值替换数组。对于每个输入文档,输出n 个文档,其中n是数组元素的数量,对于空数组可以为零。

$group

  • 按指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个组。消耗所有输入文档并为每个不同组输出一个文档。输出文档仅包含标识符字段和累积字段(如果指定)。

$sort

  • 按指定的排序键对文档流重新排序。仅顺序发生变化;文件保持不变。对于每个输入文档,输出一个文档。

SQL 示例:

root@localhost 17:58:04 [test]> SELECT cust_id, SUM(i.qty) as qty  FROM orders o,  orders_item i WHERE i.order_id = o._id GROUP BY cust_id order by qty desc; 
+---------+------+
| cust_id | qty  |
+---------+------+
| D       |   50 |
| B       |   35 |
| C       |   30 |
| A       |   23 |
+---------+------+
4 rows in set (0.00 sec)

MongoDB 示例:

sit_rs1:PRIMARY> db.orders.aggregate( 
... [
...    { $unwind: "$items" },
...    { $group: { _id: "$cust_id", qty: { $sum: "$items.qty" } } },
...    { $sort: { qty: -1 }}
... ] 
... )
{ "_id" : "D", "qty" : 50 }
{ "_id" : "B", "qty" : 35 }
{ "_id" : "C", "qty" : 30 }
{ "_id" : "A", "qty" : 23 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基本类型和String类型的相互转化

文章目录 java基本类型和String类型的相互转化String 类型转基本类型byteshortintlongdoublefloat 基本类型转String类型方法1方法2 java基本类型和String类型的相互转化 String 类型转基本类型 byte String s "123"; byte b Byte.parseByte(s);short String s…

ChatGPT结合知识图谱构建医疗问答应用 (二) - 构建问答流程

一、ChatGPT结合知识图谱 上篇文章对医疗数据集进行了整理,并写入了知识图谱中,本篇文章将结合 ChatGPT 构建基于知识图谱的问答应用。 下面是上篇文章的地址: ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱 这里实现问答的流程…

前端后端路径问题详解

加了项目名,访问所有页面都是 在 项目名下 出来的路径 不加项目名,访问所有页面都不用加项目名,然后前后端的加/的效果都一样,都是在根目录下没有项目名的路径!!! 后端 一、MVC 1.不管是转发…

小研究 - JVM GC 对 IMS HSS 延迟分析(二)

用户归属服务器(IMS HSS)是下一代通信网(NGN)核心网络 IP 多媒体子系统(IMS)中的主要用户数据库。IMS HSS 中存储用户的配置文件,可执行用户的身份验证和授权,并提供对呼叫控制服务器…

Segment anything(图片分割大模型)

目录 1.Segment anything 2.补充图像分割和目标检测的区别 1.Segment anything 定义:图像分割通用大模型 延深:可以预计视觉检测大模型,也快了。 进一步理解:传统图像分割对于下图处理时,识别房子的是识别房子的模型…

三数之和——力扣15

文章目录 题目描述法一 双指针排序 题目描述 法一 双指针排序 class Solution{ public:vector<vector<int>> threeSum(vector<int>& nums){int nnums.size();vector<vector<int>> ans;sort(nums.begin(), nums.end());for(int first0;first&…

【Docker】Docker应用部署之Docker容器安装MySQL

目录 一、搜索MySQL镜像 二、拉取MySQL镜像 三、创建容器 四、测试安装 一、搜索MySQL镜像 docker search mysql 二、拉取MySQL镜像 docker pull mysql:5.7 # 冒号后是要部署的版本号 三、创建容器 首先需要在宿主机创建数据卷的目录 mkdir /root/mysql # 创建目录 …

Linux进程管理

进程是操作系统中正在执行的一个命令或程序。在 Linux 系统当中&#xff0c;每当触发任何一个事件时&#xff0c;系统都会将它定义成为一个进程&#xff0c;并且给予这个进程一个ID&#xff0c;称为PID&#xff0c;同时根据触发进程用户的权限给予这个PID一组有效的权限设置。在…

【PHP】简记问题:使用strtotime(‘-1 month‘, time)获取上个月第一天时间戳出错

发生场景 在7月31号是查看统计上个月订单购买总金额&#xff0c;查询结果为0 $preMonthStart strtotime(date(Ym01, strtotime("-1 month"))); $curMonthStart strtotime(date(Ym01)); # 统计上月份实际订单金额 $sql "SELECT count(money) FROM orders WH…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(17)-Fiddler如何充当第三者再识AutoResponder标签-下

1.简介 上一篇宏哥主要讲解的一些在电脑端的操作和应用&#xff0c;今天宏哥讲解和分享一下&#xff0c;在移动端的操作和应用。其实移动端和PC端都是一样的操作&#xff0c;按照宏哥前边抓取移动端包设置好&#xff0c;就可以开始实战了。 2.界面功能解析 根据下图图标注位…

Vue基本语法

1. 官网&#xff1a; Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) 一、示例代码 如下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…

【Coppeliasim C++】焊接机械臂仿真

项目思维导图 该项目一共三个demo&#xff1a; 机械臂末端走直线 2. 变位机转台转动 3.机械臂末端多点样条运动 笔记&#xff1a; 基于等级的蚁群系统在3D网格地图中搜索路径的方法: 基于等级的蚁群系统(Hierarchical Ant Colony System,HACS)是一种改进的蚁群优化算法。它在传…

深度学习实战44-Keras框架下实现高中数学题目的智能分类功能应用

大家好,我是微学AI ,今天给大家介绍一下深度学习实战44-Keras框架实现高中数学题目的智能分类功能应用,该功能是基于人工智能技术的创新应用,通过对数学题目进行智能分类,提供个性化的学习辅助和教学支持。该功能的实现可以通过以下步骤:首先,采集大量的高中数学题目数据…

一百三十八、ClickHouse——使用clickhouse-backup备份ClickHouse库表

一、目标 使用clickhouse-backup在本地全库备份ClickHouse的数据库 二、前提 已经安装好clickhouse-backup 注意&#xff1a;由于之前同事已经按照好clickhouse-backup&#xff0c;所以我就没有安装 如有需要请参考其他人的博客安装一下&#xff0c;下面是我认为比较好的一…

分解质因子,将一个不小于2的整数分解质因数,例如,输入90,则输出:90=2*3*3*5

假设一个不小于2的整数n&#xff0c;对从2开始的自然数k&#xff0c;这个试探它是否是整数n的一个因子&#xff0c;如果是&#xff0c;则输出该因子&#xff0c;并将n/k的结果赋给n&#xff08;接下来只需要对n除以已经找到的因子之后的结果继续找因子&#xff09;。如果n的值不…

基于 STM32+FPGA 的通用工业控制器设计(一)系统方案设计

本章首先介绍了现有 PLC 系统的概况&#xff0c;然后提出了本文设计的通用工业控制器的 整体方案架构&#xff0c;分析了硬件和软件上需要实现的功能&#xff0c;最后对各部分功能进行分析并提 出具体的实现方案。 2.1 PLC 系统简介 可编程逻辑控制器&#xff08; Progra…

30天p小白学python-第三天(面向对象编程基础-进阶)

面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程",我们先来看看比较正式的说法。 "把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class)…

eventBus使用遇到的坑

**问题&#xff1a;**通过eventBus传递的参数&#xff0c;在子组件的methods中无法通过this.使用。 **思路&#xff1a;**考虑组件方法的执行顺序&#xff08;vue生命周期执行顺序&#xff09; **解决办法&#xff1a;**在传递参数的组件外 this.$nextTick this.$nextTick(() …

Spring 类型安全的配置属性

使用 Value("${property}") 注解来注入配置属性有时会很麻烦&#xff0c;特别是当你要处理多个属性或你的数据是分层的。 Spring Boot提供了一种处理属性的替代方法&#xff0c;让强类型的Bean管理和验证你的应用程序的配置。 另请参见Value 和类型安全配置属性之间的…

Android 面试题 避免OOM(内存优化)三

&#x1f525; OOM介绍&#xff08;out of memory 内存溢出&#xff09;&#x1f525; Android和java中都会出现由于不良代码引起的内存泄露&#xff0c;为了使Android应用程序能够快速高效的运行&#xff0c;Android每个应用程序都会有专门Dalvik虚拟机实例来运行&#xff0c;…