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

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 }

相关文章:

Mongodb SQL 到聚合映射快速参考

SQL 映射 聚合管道允许MongoDB 提供原生聚合功能,对应于 SQL 中许多常见的数据聚合操作。比如:GROUP BY、COUNT()、UNION ALL 测试数据 For MySQL rootlocalhost 14:40:40 [test]> select * from orders; -------------------------------------…...

腾讯云标准型S6/SA3/SR1/S5/SA2服务器CPU处理器大全

腾讯云服务器CVM标准型CPU处理器大全,包括标准型S6、SA3、SR1、S5、S5se、SA2、S4、SN3ne、S3、SA1、S2ne实例CPU处理器型号大全,标准型S6云服务器CPU采用Intel Ice Lake(2.7GHz/3.3GHz),标准型S5采用Intel Xeon Cascade Lake 8255C/Intel Xe…...

idea 关于高亮显示与选中字符串相同的内容

dea 关于高亮显示与选中字符串相同的内容,本文作为个人备忘的同时也希望可以作为大家的参考。 依次修改File-settings-Editor-Color Scheme-General菜单下的Code-Identifier under caret和Identifier under caret(write)的Backgroud色值,可以参考下图。…...

【重点:单例模式】特殊类设计

请设计一个类,只能在堆上创建对象 方式如下: 将构造函数设置为私有,防止外部直接调用构造函数在栈上创建对象。向外部提供一个获取对象的static接口,该接口在堆上创建一个对象并返回。将拷贝构造函数设置为私有,并且…...

智能家居是否可与ChatGPT深度融合?

​ ChatGPT自2022年面世以来,已为亿万网民提供智能问答服务。然而我们是否曾想到,这一人工智能驱动的聊天机器人,是否可为智能家居赋能? 要实现ChatGPT与智能家居设备之间的无缝对话,单单依靠一台终端是远远不够的。ChatGPT必须…...

LED芯片 VAS1260IB05E 带内部开关LED驱动器 汽车硬灯带灯条解决方案

VAS1260IB05E深力科LED芯片是一种连续模式电感降压转换器,设计用于从高于LED电压的电压源高效驱动单个或多个串联连接的LED。该设备在5V至60V之间的输入电源下工作,并提供高达1.2A的外部可调输出电流。包括输出开关和高侧输出电流感测电路,该…...

微信小程序插件 painter 生成海报、二维码

GitHub 地址&#xff1a;https://github.com/Kujiale-Mobile/Painter 一、引入 将 components/painter 整个文件放到自己项目的 components 中&#xff1b;以组件的形式在页面的 json 文件中引入&#xff1b; 二、使用 <view class"container"><image s…...

Python版day60

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 class Solution:def largestRectangleArea(self, heights: List[int]) -> i…...

windows C++多线程同步<3>-互斥量

windows C多线程同步&#xff1c;3&#xff1e;-互斥量 概念&#xff0c;如下图&#xff1a; 另外就是互斥对象谁拥有&#xff0c;谁释放 那么一个线程允许多次获取互斥对象吗&#xff1f; 答案是允许&#xff0c;但是申请多次就要释放多次&#xff0c;否则其他线程获取不到互…...

(学习笔记-系统结构)Linux内核与windows内核

内核 计算机是由各种外部硬件设备组成的&#xff0c;比如内存、CPU、硬盘等&#xff0c;如果每个应用都要和这些硬件设备对接通信协议&#xff0c;那这样太累了&#xff0c;所以这个中间人由内核来负责&#xff0c;让内核作为应用连接硬件设备的桥梁&#xff0c;应用程序只关心…...

find_in_set在oracle下的解决方案

比如一张表&#xff1a; artile (id,type,content); # type:1表示文艺类&#xff0c;2表示小说类&#xff0c;3表示传记&#xff0c;4表示传说&#xff0c;等等5,6,7,8表数据&#xff1a; idtypecontent13,1dfasdfasdf21,3,6,8dfasdf36,8,9add 现在要找出3传记类的artile记录…...

智能垃圾桶

1.树莓派3B引脚图 2. 原理图 3.舵机线图 搜了这个这么多3b的资料&#xff0c;自己只是想解决如何下程序和运行程序的博客&#xff0c;网上搜集的资料全是讲如何通过SSH或者网线连接树莓派&#xff0c;通过直接连接屏幕的教程较少。 遇到问题&#xff1a;不论是舵机还是其他传…...

面试题-TS(十):如何处理可选属性和默认参数?

面试题-TS(10)&#xff1a;如何处理可选属性和默认参数&#xff1f; 1. 可选属性 1.1 什么是可选属性&#xff1f; 在TypeScript中&#xff0c;可选属性是指在定义接口或类时&#xff0c;指定某些属性不是必须的&#xff0c;可以存在也可以不存在。使用可选属性可以让我们定…...

Istio Pilot源码学习(一):Pilot-Discovery启动流程、ConfigController配置规则发现

本文基于Istio 1.18.0版本进行源码学习 1、Pilot-Discovery工作原理 Pilot-Discovery是Istio控制面的核心&#xff0c;负责服务网格中的流量管理以及控制面和数据面之间的配置下发 Pilot-Discovery从注册中心&#xff08;如Kubernetes&#xff09;获取服务信息并汇集&#xff…...

数据结构:顺序表(C实现)

个人主页 水月梦镜花 个人专栏 C语言 &#xff0c;数据结构 文章目录 一、顺序表二、实现思路1.存储结构2.初始化顺序表(SeqListInit)3.销毁顺序表(SeqListDestroty)4.打印顺序表(SeqListPrint)5.顺序表尾插(SeqListPushBack)and检查容量(SeqListCheckCapacity)6.顺序表头插(Se…...

素描基础知识

素描基础入门 1.基础线条 1.1 握笔姿势及长线条 2.排线 2.1 不同姿势画排线 2.1.1 姿势画排线 2.1.2 用手腕画排线 2.1.3 小拇指画排线 2.1.4 叠加排线 2.1.5交叉排线 2.2 纸张擦法 2.3 排线学习榜样 2.4 四种常见的排线 3、定向连线 4、一点透视 4.1 透视的规律 4.2 焦点透视…...

【Chat GPT】用 ChatGPT 运行 Python

前言 ChatGPT 是一个基于 GPT-2 模型的人工智能聊天机器人&#xff0c;它可以进行智能对话&#xff0c;同时还支持 Python 编程语言的运行&#xff0c;可以通过 API 接口进行调用。本文将介绍如何使用 ChatGPT 运行 Python 代码&#xff0c;并提供一个实际代码案例。 ChatGPT …...

cartographer发布畸变矫正后的scan数据

实现方式&#xff1a; 模仿源代码&#xff0c;在cartographer_ros写一个函数&#xff0c;以函数指针的方式传入cartographer后端&#xff0c;然后接收矫正后的scan数据&#xff0c;然后按照话题laserScan发布出来。 需要同时发布点云强度信息的&#xff0c;还要自己添加含有强度…...

Idea中git push to origin/master was rejected错误解决方案

Idea中git push to origin/master was rejected错误解决方案 问题描述解决方法 问题描述 idea开发中,需要将项目发布到gitee上,在gitee上创建仓库后,通过idea中git推送项目代码提示: push to origin/master was rejected 解决方法 gitee创建仓库时创建了README.md文件,本地…...

docker版jxTMS使用指南:自定义频率型动态管控

本文讲解4.4版jxTMS中如何自行定义一个频率型的动态管控&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...