MongoDB - 聚合操作符 $eq、$gte、$in、$sum、$avg
文章目录
- 1. $eq
- 2. $gte
- 3. $in
- 4. $sum
- 5. $avg
1. $eq
$eq比较两个值并返回:true (当值相等时)|false(当值不相等时)
{ $eq: [ <expression1>, <expression2> ] }
构造测试数据:
db.inventory.drop()db.inventory.insertMany({{ "_id" : 1, "item" : "abc1", description: "product 1", qty: 300 },{ "_id" : 2, "item" : "abc2", description: "product 2", qty: 200 },{ "_id" : 3, "item" : "xyz1", description: "product 3", qty: 250 },{ "_id" : 4, "item" : "VWZ1", description: "product 4", qty: 300 },{ "_id" : 5, "item" : "VWZ2", description: "product 5", qty: 180 }
})
以下操作使用 $eq 操作符来判断 qty 是否等于 250:
db.inventory.aggregate([{$project:{item: 1,qty: 1,qtyEq250: { $eq: [ "$qty", 250 ] },_id: 0}}]
)
// 1
{"item": "abc1","qty": 300,"qtyEq250": false
}// 2
{"item": "abc2","qty": 200,"qtyEq250": false
}// 3
{"item": "xyz1","qty": 250,"qtyEq250": true
}// 4
{"item": "VWZ1","qty": 300,"qtyEq250": false
}// 5
{"item": "VWZ2","qty": 180,"qtyEq250": false
}
//输入文档实体类
@Data
@Document(collection = "inventory")
public class Inventory {private int _id;private String item;private String description;private int qty;
}//输出文档实体类
@Data
public class AggregationResult {private String item;private String qty;private Boolean qtyEq250;
}//执行聚合操作
@SpringBootTest
@RunWith(SpringRunner.class)
public class BeanLoadServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void queryTest() {// $project 聚合阶段ProjectionOperation projectionOperation = Aggregation.project("item", "qty").andExclude("_id").andExpression("qty==250").as("qtyEq250");Aggregation aggregation = Aggregation.newAggregation(projectionOperation);AggregationResults<AggregationResult> aggregate = mongoTemplate.aggregate(aggregation, Inventory.class, AggregationResult.class);List<AggregationResult> mappedResults = aggregate.getMappedResults();mappedResults.forEach(System.out::println);//AggregationResult(item=abc1, qty=300.0, qtyEq250=false)//AggregationResult(item=abc2, qty=200.0, qtyEq250=false)//AggregationResult(item=xyz1, qty=250.0, qtyEq250=true)//AggregationResult(item=VWZ1, qty=300.0, qtyEq250=false)//AggregationResult(item=VWZ2, qty=180.0, qtyEq250=false)}
}
2. $gte
$gt 比较两个值并返回:true(当第一个值大于第二个值时),false(当第一个值小于或者等于第二个值时)
{ $gt: [ <expression1>, <expression2> ] }
构造测试数据:
db.inventory.drop()db.inventory.insertMany([{ "_id" : 1, "item" : "abc1", description: "product 1", qty: 300 },{ "_id" : 2, "item" : "abc2", description: "product 2", qty: 200 },{ "_id" : 3, "item" : "xyz1", description: "product 3", qty: 250 },{ "_id" : 4, "item" : "VWZ1", description: "product 4", qty: 300 },{ "_id" : 5, "item" : "VWZ2", description: "product 5", qty: 180 }
])
以下操作使用 $gt 操作符来判断 qty 是否大于 250:
db.inventory.aggregate([{$project:{_id: 0,item: 1,qty: 1,qtyGt250: { $gt: [ "$qty", 250 ] }}}]
)
//输入文档实体类
@Data
@Document(collection = "inventory")
public class Inventory {private int _id;private String item;private String description;private int qty;
}//输出文档实体类
@Data
public class AggregationResult {private String item;private String qty;private Boolean qtyGt250;
}//执行聚合操作
@SpringBootTest
@RunWith(SpringRunner.class)
public class BeanLoadServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void queryTest() {//$project聚合阶段ProjectionOperation projectionOperation = Aggregation.project("item", "qty").andExclude("_id").andExpression("qty>250").as("qtyGt250");//组合聚合阶段Aggregation aggregation = Aggregation.newAggregation(projectionOperation);//执行聚合阶段AggregationResults<AggregationResult> aggregationResults = mongoTemplate.aggregate(aggregation, Inventory.class, AggregationResult.class);List<AggregationResult> mappedResults = aggregationResults.getMappedResults();//打印mappedResults.forEach(System.out::println);//AggregationResult(item=abc1, qty=300.0, qtyGt250=true)//AggregationResult(item=abc2, qty=200.0, qtyGt250=false)//AggregationResult(item=xyz1, qty=250.0, qtyGt250=false)//AggregationResult(item=VWZ1, qty=300.0, qtyGt250=true)//AggregationResult(item=VWZ2, qty=180.0, qtyGt250=false)}
}
3. $in
$in 返回一个布尔值,它可表示指定的值是否在数组中。
{ $in: [ <expression>, <array expression> ] }
| 例子 | 结果 |
|---|---|
{ $in: [ 2, [ 1, 2, 3 ] ] } | true |
{ $in: [ "abc", [ "xyz", "abc" ] ] } | true |
{ $in: [ "xy", [ "xyz", "abc" ] ] } | false |
{ $in: [ [ "a" ], [ "a" ] ] } | false |
{ $in: [ [ "a" ], [ [ "a" ] ] ] } | true |
{ $in: [ /^a/, [ "a" ] ] } | false |
{ $in: [ /^a/, [ /^a/ ] ] } | true |
构造测试数据:
db.stores.drop()db.stores.insertMany([{ "_id" : 1, "location" : "上海", "fruits" : [ "apples", "oranges", "bananas" ] },{ "_id" : 2, "location" : "北京", "fruits" : [ "bananas", "pears", "grapes" ] },{ "_id" : 3, "location" : "南京", "fruits" : [ "cantaloupes", "watermelons", "apples" ] }
])
以下聚合操作查看每个文档中的 fruits 数组,并确定是否存在字符串 bananas。
db.stores.aggregate([// $project聚合阶段:将文档中的location字段重命名为 store location字段{$project: {"store_location" : "$location","has_bananas" : {$in: [ "bananas", "$fruits" ]}}}
])
// 1
{"_id": 1,"store_location": "上海","has_bananas": true
}// 2
{"_id": 2,"store_location": "北京","has_bananas": true
}// 3
{"_id": 3,"store_location": "南京","has_bananas": false
}
4. $sum
当用作累加器时,$sum 的语法如下:
{ $sum: <expression> }
构造测试数据:
db.students.drop()db.students.insertMany([{ "_id": 1, "quizzes": [ 10, 6, 7 ], "labs": [ 5, 8 ], "finalScore": 80, "midtermScore": 75 },{ "_id": 2, "quizzes": [ 9, 10 ], "labs": [ 8, 8 ], "finalScore": 95, "midtermScore": 80 },{ "_id": 3, "quizzes": [ 4, 5, 5 ], "labs": [ 6, 5 ], "finalScore": 78, "midtermScore": 70 }
])
计算测验总分数、实验总分数以及期末和期中考试的总分数:
db.students.aggregate([{$project: {quizTotal: { $sum: "$quizzes"},labTotal: { $sum: "$labs" },examTotal: { $sum: [ "$finalScore", "$midtermScore" ] }}}
])
// 1
{"_id": 1,"quizTotal": 23,"labTotal": 13,"examTotal": 155
}// 2
{"_id": 2,"quizTotal": 19,"labTotal": 16,"examTotal": 175
}// 3
{"_id": 3,"quizTotal": 14,"labTotal": 11,"examTotal": 148
}
// 输入文档实体类
@Data
@Document(collection = "students")
public class Student {@Idprivate int id;private List<Integer> quizzes;private List<Integer> labs;private int finalScore;private int midtermScore;
}// 输出文档实体类
@Data
public class AggregationResult {private int _id;private int quizTotal;private int labTotal;private int examTotal;
}// 执行聚合操作
@SpringBootTest
@RunWith(SpringRunner.class)
public class BeanLoadServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void queryTest() {//$project聚合阶段ProjectionOperation project = Aggregation.project().andExpression("{$sum: '$quizzes'}").as("quizTotal").andExpression("{$sum: '$labs'}").as("labTotal").andExpression("$finalScore + $midtermScore").as("examTotal");//组合聚合阶段Aggregation aggregation = Aggregation.newAggregation(project);//执行聚合阶段AggregationResults<AggregationResult> aggregationResults = mongoTemplate.aggregate(aggregation, Student.class, AggregationResult.class);List<AggregationResult> mappedResults = aggregationResults.getMappedResults();//打印mappedResults.forEach(System.out::println);//AggregationResult(_id=1, quizTotal=23, labTotal=13, examTotal=155)//AggregationResult(_id=2, quizTotal=19, labTotal=16, examTotal=175)//AggregationResult(_id=3, quizTotal=14, labTotal=11, examTotal=148)}
}
5. $avg
db.sales.drop()db.sales.insertMany([{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2) },{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1) },{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5) },{ "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10) },{ "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10) }
])
按照 item 字段对文档进行分组,以下操作使用 $avg 累加器来计算每组的平均金额和平均数量:
db.sales.aggregate([{$group:{_id: "$item",avgAmount: { $avg: { $multiply: [ "$price", "$quantity" ] } },avgQuantity: { $avg: "$quantity" }}}]
)
// 输入文档实体类
@Data
@Document(collection = "sales")
public class Sales {@Idprivate int id;private String item;private int price;private int quantity;
}// 输出文档实体类
@Data
public class AggregationResult {private int _id;private int avgAmount;private int avgQuantity;
}// 执行聚合操作
@Test
public void queryTest() {//$group聚合阶段GroupOperation groupOperation = Aggregation.group("item").avg(ArithmeticOperators.Multiply.valueOf("price").multiplyBy("quantity")).as("avgAmount").avg("quantity").as("avgQuantity");//组合聚合阶段Aggregation aggregation = Aggregation.newAggregation(groupOperation);//执行聚合阶段AggregationResults<AggregationResult> aggregationResults = mongoTemplate.aggregate(aggregation, Sales.class, AggregationResult.class);List<AggregationResult> mappedResults = aggregationResults.getMappedResults();//打印mappedResults.forEach(System.out::println);//AggregationResult(_id=0, avgAmount=3512, avgQuantity=8)
}
相关文章:
MongoDB - 聚合操作符 $eq、$gte、$in、$sum、$avg
文章目录 1. $eq2. $gte3. $in4. $sum5. $avg 1. $eq $eq比较两个值并返回:true (当值相等时)|false(当值不相等时) { $eq: [ <expression1>, <expression2> ] }构造测试数据: db.inventory…...
C语言 | Leetcode C语言题解之第279题完全平方数
题目: 题解: // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…...
在appium中,如何通过匹配图片来进行断言?
在Appium中进行图片匹配断言,可以使用OpenCV来实现。以下是使用Appium和OpenCV进行图片匹配断言的示例代码。 首先,需要确保安装了必要的库: pip install opencv-python-headless pip install opencv-python pip install numpy然后…...
昇思25天学习打卡营第21天|CV-Shufflenet图像分类
打卡 目录 打卡 ShuffleNet 网络介绍 ShuffleNet 模型架构 Pointwise Group Convolution Channel Shuffle ShuffleNet模块 ShuffleNet 模块代码 构建ShuffleNet网络 模块代码 模型训练和评估 模型训练 模型评估 模型预测 ShuffleNet 网络介绍 ShuffleNetV1是旷视科…...
python 图片转文字、语音转文字、文字转语音保存音频并朗读
一、python图片转文字 1、引言 pytesseract是基于Python的OCR工具, 底层使用的是Google的Tesseract-OCR 引擎,支持识别图片中的文字,支持jpeg, png, gif, bmp, tiff等图片格式 2、环境配置 python3.6PIL库安装Google Tesseract OCR 3、安…...
SSRF (服务端请求伪造)
🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…...
SQL中的LEFT JOIN、RIGHT JOIN和INNER JOIN
在SQL中,JOIN操作是连接两个或多个数据库表,并根据两个表之间的共同列(通常是主键和外键)返回数据的重要方法。其中,LEFT JOIN(左连接)、RIGHT JOIN(右连接)和INNER JOIN…...
[网鼎杯 2020 朱雀组]Nmap(详细解读版)
这道题考察nmap的一些用法,以及escapeshellarg和escapeshellcmd两个函数的绕过,可以看这里PHP escapeshellarg()escapeshellcmd() 之殇 (seebug.org) 两种解题方法: 第一种通过nmap的-iL参数读取扫描一个文件到指定文件中第二种是利用nmap的参数写入we…...
【React】详解“最新”和“最热”切换与排序
文章目录 一、基本概念和初始化二、切换与排序功能的实现1. 函数定义和参数2. 设置活动 Tab3. 定义新列表变量4. 根据排序类型处理列表4.1 按时间降序排序4.2 按点赞数降序排序 5. 更新评论列表 三、渲染导航 Tab 和评论列表1. map 方法2. key 属性3. className 动态赋值4. onC…...
BUUCTF [MRCTF2020]Ezpop
这道题对于刚接触到pop链的我直接把我整懵了,一边看着魔术方法一边分析 魔术方法可以看这里PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程,简单编程 (twle.cn) 代码解析 经过以上的分析我们可以理一下解题思路:接收参数反序列化之前先触发…...
RV1126 Linux 系统,接外设,时好时坏(一)应该从哪些方面排查问题
在 Linux 系统中接外设时,遇到“时好时坏”的问题,可能是由多种因素引起的。以下是一些排查问题的建议。 1. 硬件方面的排查 1.1 连接检查 物理连接: 确保外设与主板之间的连接良好,检查插头、插座及线缆是否牢固。引脚配置: 确认设备树中引脚的配置是否正确,尤其是引脚…...
Vue实现简单小案例
一、创建文件夹 二、引用vue.js <script src"../js/vue.js"></script> 三、准备一个容器 <div id"app"><h1>Hello,{{name}}</h1> </div> 四、创建实例 <script>new Vue({el:"#app", //el用于指…...
【MATLAB APP】建立独立桌面APP
背景:已有MATLAB APP的.mlapp文件,但客户提出需要可以直接使用的exe文件。 要求:点开即用,无需下载MATLAB。使用者无法修改APP的代码。 一、环境配置 APP创建者:安装MATLAB R2023a,配置Application Compile…...
Spring的优缺点?
Spring的优缺点 直接回答相关的Spring的特点: IOC AOP 事务 简化开发: 容易集成JDBCTemplateRestTemplate(接口远程调用)邮件发送相关异步消息请求支持 更加深入就讲源码了 优点: 方便解耦,简化开发…...
第一百八十三节 Java IO教程 - Java目录事件、Java异步I/O
Java IO教程 - Java目录事件 当文件系统中的对象被修改时,我们可以监听watch服务以获取警报。 java.nio.file包中的以下类和接口提供watch服务。 Watchable接口WatchService接口WatchKey接口WatchEvent接口WatchEvent.Kind接口StandardWatchEventKinds类 可监视对…...
【设计模式】(万字总结)深入理解Java中的创建型设计模式
1. 前言 在软件开发的世界里,设计模式是一种被广泛接受并应用的解决方案。它们不仅仅是代码的设计,更是对问题的思考和解决的方法论。在Java开发中,特别是在面向对象的编程中,设计模式尤为重要。创建型设计模式,作为设…...
【全面讲解下Docker in Docker的原理与实践】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 👉目录 👉前言👉原理👉实践👉安全和最佳实践👉前言 🦛…...
Android Settings增加多击事件,增加开发者模式打开难度
软件平台:Android11 硬件平台:QCS6125 需求来源:用户通过系统异常崩溃,进入原生Settings页面,通过默认的多击版本号方式打开开发者模式,继而打开adb调试开关,安装三方apk。 对付这种需求本来有…...
【相机与图像】1. 相机模型的介绍:内参、外参、畸变参数
想着整理下相机模型(内容上参考 slam十四讲)、相机的内外参标定。方便自己的使用和回顾。 不过,内外参标定啥时候记录随缘 -_- 概述 【构建相机模型】 相机将三位世界中的坐标点(单位为米)映射到二维图像平面ÿ…...
Linux内核netlink机制 - 用户空间和内核空间数据传输
简介: Netlink socket 是一种Linux特有的socket,用于实现用户空间与内核空间通信的一种特殊的进程间通信方式(IPC) ,也是网络应用程序与内核通信的最常用的接口。 Netlink 是一种在内核和用户应用间进行双向数据传输的非常好的方式&a…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
