MongoDB 聚合管道中使用算术表达式运算符
算术表达式运算符主要用于实现数字之间的算术运算,主要包含了对加、减、乘、除、余数、截取、舍入等算术操作。
下面我们进行详细介绍:
一、准备数据
初始化商品数据
db.goods.insertMany([{ "_id": 1, name: "薯片", size: "S", quantity: 10, sale: 50, price: 8, salePrice: 5, expirationTime: ISODate( "2023-08-08T00:00:00Z" ) },{ "_id": 2, name: "薯片", size: "L", quantity: 8, sale: 30, price: 12, salePrice: 10, expirationTime: ISODate( "2023-08-08T00:00:00Z" ) },{ "_id": 3, name: "牛肉干", size: "L", quantity: 5, sale: 10, price: 30, salePrice: 30, expirationTime: ISODate( "2023-10-10T00:00:00Z" ) },{ "_id": 4, name: "可口可乐", size: "S", quantity: 10, sale: 100, price: 3, salePrice: 3, expirationTime: ISODate( "2025-01-06T00:00:00Z" ) },{ "_id": 5, name: "可口可乐", size: "L", quantity: 6, sale: 10, price: 10, salePrice: 5, expirationTime: ISODate( "2025-01-06T00:00:00Z" ) },{ "_id": 6, name: "旺仔牛奶", size: "L", quantity: 10, sale: 10, price: 5, salePrice: 4.5, expirationTime: ISODate( "2023-08-10T00:00:00Z" )}
])
其中,
quantity代表的是商品剩余数量
sale代表的是已售商品数量
price代表的是商品指导价
salePrice代表的是商品当前价格
二、加($add)
语法:{ $add: [ <expression1>, <expression2>, ... ] }
将多个表达式的结果相加。
例子:统计商品的总数量
db.goods.aggregate([{ $project: {"name": 1,"size": 1,"total": { $add: [ "$quantity", "$sale" ] }}}
])
聚合查询的结果如下:
{ "_id" : 1, "name" : "薯片", "size" : "S", "total" : 60 }
{ "_id" : 2, "name" : "薯片", "size" : "L", "total" : 38 }
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "total" : 15 }
{ "_id" : 4, "name" : "可口可乐", "size" : "S", "total" : 110 }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "total" : 16 }
{ "_id" : 6, "name" : "旺仔牛奶", "size" : "L", "total" : 20 }
三、减($subtract)
语法:{ $subtract: [ <expression1>, <expression2> ] }
将两个表达式的结果相减。expression1 - expression2
例子:计算商品的优惠价格
db.goods.aggregate([{ $project: {"name": 1,"size": 1,"discount": { $subtract: [ "$price", "$salePrice" ] }}}
])
聚合查询的结果如下:
{ "_id" : 1, "name" : "薯片", "size" : "S", "discount" : 3 }
{ "_id" : 2, "name" : "薯片", "size" : "L", "discount" : 2 }
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "discount" : 0 }
{ "_id" : 4, "name" : "可口可乐", "size" : "S", "discount" : 0 }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "discount" : 5 }
{ "_id" : 6, "name" : "旺仔牛奶", "size" : "L", "discount" : 0.5 }
四、乘($multiply)
语法:{ $multiply: [ <expression1>, <expression2>, ... ] }
将多个表达式的结果相乘。
例子:计算剩余商品的总价值
db.goods.aggregate([{$project: {"name": 1,"size": 1,"totalValue": { $multiply: [ "$quantity", "$salePrice" ] }}}
])
聚合查询的结果如下:
{ "_id" : 1, "name" : "薯片", "size" : "S", "totalValue" : 50 }
{ "_id" : 2, "name" : "薯片", "size" : "L", "totalValue" : 80 }
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "totalValue" : 150 }
{ "_id" : 4, "name" : "可口可乐", "size" : "S", "totalValue" : 30 }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "totalValue" : 30 }
{ "_id" : 6, "name" : "旺仔牛奶", "size" : "L", "totalValue" : 45 }
五、除($divide)
语法:{ $divide: [ <expression1>, <expression2> ] }
将两个表达式的结果相除。expression1 / expression2
例子:计算商品的折扣
db.goods.aggregate([{$project: {"name": 1,"size": 1,"discount": { $divide: [ "$salePrice", "$price" ] }}}
])
聚合查询的结果如下:
{ "_id" : 1, "name" : "薯片", "size" : "S", "discount" : 0.625 }
{ "_id" : 2, "name" : "薯片", "size" : "L", "discount" : 0.8333333333333334 }
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "discount" : 1 }
{ "_id" : 4, "name" : "可口可乐", "size" : "S", "discount" : 1 }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "discount" : 0.5 }
{ "_id" : 6, "name" : "旺仔牛奶", "size" : "L", "discount" : 0.9 }
六、余数($mod)
语法:{ $mod: [ <expression1>, <expression2> ] }
将两个表达式的结果求余数。expression1 % expression2
例子:过滤出商品出售价格能被3整除的商品
db.goods.aggregate([{"$set": {"mod": { $mod: [ "$salePrice", 3 ] }}},{$match: {"mod": 0 }},{$project: {"name": 1,"size": 1,"salePrice": 1}}
])
等效于:
db.goods.aggregate([{$match: {$expr: { $eq: [ { $mod: [ "$salePrice", 3 ] }, 0 ] }}},{$project: {"name": 1,"size": 1,"salePrice": 1}}
])
聚合查询的结果如下:
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "salePrice" : 30 }
{ "_id" : 4, "name" : "可口可乐", "size" : "S", "salePrice" : 3 }
七、截取($trunc)
语法:{ $trunc : [ <number>, <place> ] }
<number>:代表需要截取的数字
<place>:可选,默认是0,代表的是截取的位置
例如数字:123456.7890,如果place为2,则截取的结果为123456.78
如果place为-2,则截取的结果是123400
如果place为-6,则截取的结果是0
如果place为0,则截取的结果是123456
如果<place>为负数且绝对值等于或者超过小数点左侧的整数位数,返回0
例子:计算商品的折扣
db.goods.aggregate([{$project: {"name": 1,"size": 1,"discount": {$trunc: [{$multiply: [ { $divide: [ "$salePrice", "$price" ] }, 10 ]},1]}}}
])
聚合查询的结果如下:
{ "_id" : 1, "name" : "薯片", "size" : "S", "discount" : 6.2 }
{ "_id" : 2, "name" : "薯片", "size" : "L", "discount" : 8.3 }
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "discount" : 10 }
{ "_id" : 4, "name" : "可口可乐", "size" : "S", "discount" : 10 }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "discount" : 5 }
{ "_id" : 6, "name" : "旺仔牛奶", "size" : "L", "discount" : 9 }
八、舍入($round)
语法:{ $round : [ <number>, <place> ] }
舍入到最接近的数字,当舍入值为5时,会舍入到最近的偶数值
<number>代表需要舍入的数字
<place>:可选,默认是0,代表的是保留的位数
例如数字:123456.7890,如果place为2,则四舍五入的结果为123456.79
如果place为-2,则舍入的结果是123400
如果place为-7,则舍入的结果是0
如果place为0,则截取的结果是123457
如果<place>为负数且绝对值超过小数点左侧的整数位数,返回0
当舍入值为5时,会舍入到最近的偶数值
例子:计算商品的折扣
db.goods.aggregate([{$project: {"name": 1,"size": 1,"discount": {$round: [{$multiply: [ { $divide: [ "$salePrice", "$price" ] }, 10 ]},1]}}}
])
聚合查询的结果:
{ "_id" : 1, "name" : "薯片", "size" : "S", "discount" : 6.2 }
{ "_id" : 2, "name" : "薯片", "size" : "L", "discount" : 8.3 }
{ "_id" : 3, "name" : "牛肉干", "size" : "L", "discount" : 10 }
{ "_id" : 4, "name" : "可口可乐", "size" : "S", "discount" : 10 }
{ "_id" : 5, "name" : "可口可乐", "size" : "L", "discount" : 5 }
{ "_id" : 6, "name" : "旺仔牛奶", "size" : "L", "discount" : 9 }
相关文章:
MongoDB 聚合管道中使用算术表达式运算符
算术表达式运算符主要用于实现数字之间的算术运算,主要包含了对加、减、乘、除、余数、截取、舍入等算术操作。 下面我们进行详细介绍: 一、准备数据 初始化商品数据 db.goods.insertMany([{ "_id": 1, name: "薯片", size: &q…...
代码随想录算法训练营第四十三天-动态规划5|1049. 最后一块石头的重量 II , 494. 目标和 , 474.一和零
最后一块石头重量转化为将一个集合分隔成两个集合,两个集合之间的差值最小,就是最后剩下最小的石头重量。这里可以求集合的一个平均值,如果正好等于平均值,说明可以抵消,这时候重量为0,如果不行,…...
《淘宝网店》:计算总收益
目录 一、题目 二、思路 1、当两个年份不一样的时候 (1)from年剩余之后的收益 (2)中间年份的全部收益 (3)to年有的收益 2、同一个年份 三、代码 详细注释版本: 简化注释版本ÿ…...
2023年03月青少年软件编程C语言一级真题答案——持续更新.....
1.字符长方形 给定一个字符,用它构造一个长为4个字符,宽为3个字符的长方形,可以参考样例输出。 时间限制:1000 内存限制:65536 输入 输入只有一行, 包含一个字符。 输出 该字符构成的长方形,长4个字符,宽3个字符。 样例输入 * 样例输出 **** **** ****#include<bi…...
家用洗地机好用吗?好用的洗地机分享
洗地机是一种高效、节能、环保的清洁设备,广泛应用于各种场所的地面清洁工作。它不仅可以快速清洁地面,还可以有效去除污渍、油渍等难以清洁的污染物,让地面恢复光洁如新的状态。同时,洗地机还可以减少清洁人员的劳动强度…...
《分解因数》:质因数分解
目录 一、题目: 二、思路: 三、代码: 一、题目: 分解因数 《分解因数》题目链接 所谓因子分解,就是把给定的正整数a,分解成若干个素数的乘积,即 a a1 a2 a3 ... an,并且 1 < a1…...
(排序10)归并排序的外排序应用(文件排序)
TIPS 在一些文件操作函数当中,fputc与fgetc这两个函数都是针对字符的,如果说你需要往文件里面去放入整形啊等等,不是字符的类型,这时候就用fprintf,fscanf在参数里面数据类型控制一下就可以。但是话说回来,…...
浅谈根号分治与分块
文章目录 1. 根号分治哈希冲突 2. 线性分块引入教主的魔法[CQOI2011] 动态逆序对[国家集训队] 排队[HNOI2010] 弹飞绵羊蒲公英 1. 根号分治 哈希冲突 题目1 n n n 个数, m m m 次操作。操作 1 为修改某一个数的值,操作 2 为查询所有满足下标模 x x x …...
(OpenAI)ChatGPT注册登录常见问题错误代码及其解决方法
在使用 ChatGPT 的时候我们可能会碰到一些错误的代码,本文统一来介绍一下每一种错误以及解决方法。 错误代码1. 不能在当前国家使用 出现场景:一般在注册或登录的时候会出现。 原因:主要是ChatGPT检测到当前访问所在的地区不允许访问导致。 …...
MySQL主从复制、读写分离(MayCat2)实现数据同步
文章目录 1.MySQL主从复制原理。2.实现MySQL主从复制(一主两从)。3.基于MySQL一主两从配置,完成MySQL读写分离配置。(MyCat2) 1.MySQL主从复制原理。 MySQL主从复制是一个异步的复制过程,底层是基于Mysql数…...
Linux 云服务器好用吗?(解读Linux云服务器的特点优势)
如今,云计算越来越受欢迎,许多公司正在将业务转移到那里。企业向云过渡的主要原因是它提供的众多服务,包括安全和充足的存储、数据库、服务器和其他关键元素。 作为相对前|沿的技术之一,云建立在虚拟服务器上。Linux 服务器…...
研读Rust圣经解析——Rust learn-8(match,if-let简洁控制流,包管理)
研读Rust圣经解析——Rust learn-8(match,if-let简洁控制流,包管理) matchother和占位符_区别 easy matchenum matchno valuematch inner Option matchmore better way if-let整洁控制包管理模块(mod)拆分声明modpub公开use展开引用拆解模块结…...
G8期刊《全体育》期刊简介及投稿要求
G8期刊《全体育》期刊简介及投稿要求 《全体育》是由湖南体育产业集团有限公司主管、体坛传媒集团股份有限公司主办、中教体育 出版发行的体育综合性期刊。 主管:湖南体育产业集团有限公司 主办:体坛传媒集团股份有限公司 国内刊号:CN4…...
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
目录 层序遍历 思路图解 代码实现 二叉树遍历的应用 输出二叉树中的叶节点 代码实现 求二叉树的高度 思路图解 代码实现 二元运算表达式树及其遍历 由两种遍历序列确定二叉树 层序遍历 层序遍历可以通过一个队列来实现,其基本过程为: 先根…...
【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除数据库等操作解析(Cypher语句)
【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除操作解析(Cypher语句) 文章目录 【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除操作解析(Cypher语句)1. 介绍2…...
Linux移动文件和文件夹(目录)命令
命令mv 英文move 翻译移动 mv命令可以移动文件或文件夹(目录),也可以重命令(覆盖)文件。 1. 移动文件/重命名 单纯地移动某一个文件直接使用: mv <源文件名称/地址> <新文件名称/地址>这个方法…...
Pandas的应用-5
Pandas是一个强大的数据处理库,它提供了高性能、易于使用的数据结构和数据分析工具。本文将介绍Pandas常用的数据结构和常用的数据分析技术,包括DataFrame的应用、窗口计算、相关性判定、Index的应用、范围索引、分类索引、多级索引以及日期时间索引。 …...
java继承类怎么写
继承类是通过把父类的方法和属性继承到一个类中,而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承,这也是 Java语言的精髓所在。Java语言提供了一种机制,叫做派生类。在 Java中,如果没有实现了某个派生类方…...
面向对象程序设计
OOP 【面向对象程序设计】(OOP)与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中,算法是第一位的,数据结构是第二位的,这就明确地表述了程序员的工作方式。首先要确定如何操作数据&#…...
Linux 用户身份切换(su,sudo)
文章目录 Linux 用户身份切换su使用案例 sudo使用案例 visudo与/etc/sudoers单一用户可使用root所有命令,与sudoers文件语法利用wheel用户组以免密码的功能处理visudo有限制的命令操作通过别名创建visudosudo的时间间隔问题sudo搭配su的使用方式 Linux 用户身份切换…...
4个步骤让普通用户实现黑苹果EFI自动生成:OpCore Simplify智能工具全解析
4个步骤让普通用户实现黑苹果EFI自动生成:OpCore Simplify智能工具全解析 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 如何用智能工具解…...
保姆级避坑指南:手把手教你搞定CARLA 0.9.11与Autoware的ROS话题转发(附完整代码)
深度解析CARLA与Autoware联合仿真中的ROS话题转发实战 在自动驾驶仿真开发领域,CARLA与Autoware的联合使用已成为研究热点。许多开发者在尝试将两者结合时,往往会在ROS话题转发环节遇到各种"坑"。本文将聚焦这一关键环节,提供一份详…...
如何在3分钟内为Axure RP配置中文界面:终极汉化指南
如何在3分钟内为Axure RP配置中文界面:终极汉化指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 你是…...
PostgreSQL(OpenGauss/MogDB) 大小写转换实战:批量处理表名与字段名的自动化方案
1. 为什么PostgreSQL的大小写问题让人头疼? 第一次用PostgreSQL的时候,我就被它的大小写规则坑惨了。明明在Oracle里运行好好的SQL语句,搬到PostgreSQL就报"relation does not exist"错误。后来才发现,原来PostgreSQL对…...
BoneAnimCopy: 跨模型骨骼动画复用解决方案,提升10倍效率的动画师实践指南
BoneAnimCopy: 跨模型骨骼动画复用解决方案,提升10倍效率的动画师实践指南 【免费下载链接】blender_BoneAnimCopy 用于在blender中桥接骨骼动画的插件 项目地址: https://gitcode.com/gh_mirrors/bl/blender_BoneAnimCopy 在3D动画制作领域,动画…...
RWKV7-1.5B-g1a镜像优势解析:离线加载兼容+软链修复+日志分级排查设计
RWKV7-1.5B-g1a镜像优势解析:离线加载兼容软链修复日志分级排查设计 1. 平台简介与核心能力 rwkv7-1.5B-g1a是基于新一代RWKV-7架构的多语言文本生成模型,专为轻量级应用场景优化设计。该镜像经过工程化改造,在保持原模型优秀生成能力的同时…...
长上下文不可强求:从 Gemini 到 Opus,1M context 为什么还没体现出应有价值
长上下文不可强求:从 Gemini 到 Opus,1M context 为什么还没体现出应有价值 摘要 过去一年,long context 一直是大模型产品最容易被拿来宣传的能力之一。32K 不够,就上 128K;128K 还不够,就上 1M。看起来&a…...
告别AI瞎编代码:手把手教你用Context7 MCP给Claude/Cursor装上“实时文档库”
告别AI幻觉代码:Context7 MCP与主流开发工具深度集成实战指南 每次看到AI助手生成那些无法运行的过时代码时,你是否也感到沮丧?作为深度依赖AI编程助手的开发者,我们都经历过这样的困境:花费数小时调试一段本不该出现的…...
考研数学二必备:多元函数极值最值实战技巧(附拉格朗日乘数法详解)
考研数学二多元函数极值最值实战指南:从基础到高阶解题策略 多元函数极值与最值问题在考研数学二中占据重要地位,每年真题中至少出现1-2道大题。许多考生在面对这类问题时容易陷入"知道概念但不会解题"的困境。本文将打破传统教材的讲解顺序&a…...
6.其他计算机系统基础知识
一、其他计算机系统基础知识 00:00 1. 计算机语言 00:31 1)计算机语言的概念 01:56 定义: 用于人与计算机之间交流的语言,是传递信息的媒介组成结构: 表达式: 包含变量、常量、字面量和运算符流程控制: 包括分支、循…...
