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

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 聚合管道中使用算术表达式运算符

算术表达式运算符主要用于实现数字之间的算术运算&#xff0c;主要包含了对加、减、乘、除、余数、截取、舍入等算术操作。 下面我们进行详细介绍&#xff1a; 一、准备数据 初始化商品数据 db.goods.insertMany([{ "_id": 1, name: "薯片", size: &q…...

代码随想录算法训练营第四十三天-动态规划5|1049. 最后一块石头的重量 II , 494. 目标和 , 474.一和零

最后一块石头重量转化为将一个集合分隔成两个集合&#xff0c;两个集合之间的差值最小&#xff0c;就是最后剩下最小的石头重量。这里可以求集合的一个平均值&#xff0c;如果正好等于平均值&#xff0c;说明可以抵消&#xff0c;这时候重量为0&#xff0c;如果不行&#xff0c…...

《淘宝网店》:计算总收益

目录 一、题目 二、思路 1、当两个年份不一样的时候 &#xff08;1&#xff09;from年剩余之后的收益 &#xff08;2&#xff09;中间年份的全部收益 &#xff08;3&#xff09;to年有的收益 2、同一个年份 三、代码 详细注释版本&#xff1a; 简化注释版本&#xff…...

2023年03月青少年软件编程C语言一级真题答案——持续更新.....

1.字符长方形 给定一个字符,用它构造一个长为4个字符,宽为3个字符的长方形,可以参考样例输出。 时间限制:1000 内存限制:65536 输入 输入只有一行, 包含一个字符。 输出 该字符构成的长方形,长4个字符,宽3个字符。 样例输入 * 样例输出 **** **** ****#include<bi…...

家用洗地机好用吗?好用的洗地机分享

洗地机是一种高效、节能、环保的清洁设备&#xff0c;广泛应用于各种场所的地面清洁工作。它不仅可以快速清洁地面&#xff0c;还可以有效去除污渍、油渍等难以清洁的污染物&#xff0c;让地面恢复光洁如新的状态。同时&#xff0c;洗地机还可以减少清洁人员的劳动强度&#xf…...

《分解因数》:质因数分解

目录 一、题目&#xff1a; 二、思路&#xff1a; 三、代码&#xff1a; 一、题目&#xff1a; 分解因数 《分解因数》题目链接 所谓因子分解&#xff0c;就是把给定的正整数a&#xff0c;分解成若干个素数的乘积&#xff0c;即 a a1 a2 a3 ... an,并且 1 < a1…...

(排序10)归并排序的外排序应用(文件排序)

TIPS 在一些文件操作函数当中&#xff0c;fputc与fgetc这两个函数都是针对字符的&#xff0c;如果说你需要往文件里面去放入整形啊等等&#xff0c;不是字符的类型&#xff0c;这时候就用fprintf&#xff0c;fscanf在参数里面数据类型控制一下就可以。但是话说回来&#xff0c…...

浅谈根号分治与分块

文章目录 1. 根号分治哈希冲突 2. 线性分块引入教主的魔法[CQOI2011] 动态逆序对[国家集训队] 排队[HNOI2010] 弹飞绵羊蒲公英 1. 根号分治 哈希冲突 题目1 n n n 个数&#xff0c; m m m 次操作。操作 1 为修改某一个数的值&#xff0c;操作 2 为查询所有满足下标模 x x x …...

(OpenAI)ChatGPT注册登录常见问题错误代码及其解决方法

在使用 ChatGPT 的时候我们可能会碰到一些错误的代码&#xff0c;本文统一来介绍一下每一种错误以及解决方法。 错误代码1. 不能在当前国家使用 出现场景&#xff1a;一般在注册或登录的时候会出现。 原因&#xff1a;主要是ChatGPT检测到当前访问所在的地区不允许访问导致。 …...

MySQL主从复制、读写分离(MayCat2)实现数据同步

文章目录 1.MySQL主从复制原理。2.实现MySQL主从复制&#xff08;一主两从&#xff09;。3.基于MySQL一主两从配置&#xff0c;完成MySQL读写分离配置。&#xff08;MyCat2&#xff09; 1.MySQL主从复制原理。 MySQL主从复制是一个异步的复制过程&#xff0c;底层是基于Mysql数…...

Linux 云服务器好用吗?(解读Linux云服务器的特点优势)

​  如今&#xff0c;云计算越来越受欢迎&#xff0c;许多公司正在将业务转移到那里。企业向云过渡的主要原因是它提供的众多服务&#xff0c;包括安全和充足的存储、数据库、服务器和其他关键元素。 作为相对前|沿的技术之一&#xff0c;云建立在虚拟服务器上。Linux 服务器…...

研读Rust圣经解析——Rust learn-8(match,if-let简洁控制流,包管理)

研读Rust圣经解析——Rust learn-8&#xff08;match,if-let简洁控制流&#xff0c;包管理&#xff09; matchother和占位符_区别 easy matchenum matchno valuematch inner Option matchmore better way if-let整洁控制包管理模块(mod)拆分声明modpub公开use展开引用拆解模块结…...

G8期刊《全体育》期刊简介及投稿要求

G8期刊《全体育》期刊简介及投稿要求 《全体育》是由湖南体育产业集团有限公司主管、体坛传媒集团股份有限公司主办、中教体育 出版发行的体育综合性期刊。 主管&#xff1a;湖南体育产业集团有限公司 主办&#xff1a;体坛传媒集团股份有限公司 国内刊号&#xff1a;CN4…...

数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)

目录 层序遍历 思路图解 代码实现 二叉树遍历的应用 输出二叉树中的叶节点 代码实现 求二叉树的高度 思路图解 代码实现 二元运算表达式树及其遍历 由两种遍历序列确定二叉树 层序遍历 层序遍历可以通过一个队列来实现&#xff0c;其基本过程为&#xff1a; 先根…...

【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除数据库等操作解析(Cypher语句)

【Neo4j数据库】图数据库_Neo4j增加节点&#xff08;关系&#xff09;、查询、删除操作解析&#xff08;Cypher语句&#xff09; 文章目录 【Neo4j数据库】图数据库_Neo4j增加节点&#xff08;关系&#xff09;、查询、删除操作解析&#xff08;Cypher语句&#xff09;1. 介绍2…...

Linux移动文件和文件夹(目录)命令

命令mv 英文move 翻译移动 mv命令可以移动文件或文件夹&#xff08;目录&#xff09;&#xff0c;也可以重命令&#xff08;覆盖&#xff09;文件。 1. 移动文件/重命名 单纯地移动某一个文件直接使用&#xff1a; mv <源文件名称/地址> <新文件名称/地址>这个方法…...

Pandas的应用-5

Pandas是一个强大的数据处理库&#xff0c;它提供了高性能、易于使用的数据结构和数据分析工具。本文将介绍Pandas常用的数据结构和常用的数据分析技术&#xff0c;包括DataFrame的应用、窗口计算、相关性判定、Index的应用、范围索引、分类索引、多级索引以及日期时间索引。 …...

java继承类怎么写

继承类是通过把父类的方法和属性继承到一个类中&#xff0c;而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承&#xff0c;这也是 Java语言的精髓所在。Java语言提供了一种机制&#xff0c;叫做派生类。在 Java中&#xff0c;如果没有实现了某个派生类方…...

面向对象程序设计

OOP 【面向对象程序设计】&#xff08;OOP&#xff09;与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中&#xff0c;算法是第一位的&#xff0c;数据结构是第二位的&#xff0c;这就明确地表述了程序员的工作方式。首先要确定如何操作数据&#…...

Linux 用户身份切换(su,sudo)

文章目录 Linux 用户身份切换su使用案例 sudo使用案例 visudo与/etc/sudoers单一用户可使用root所有命令&#xff0c;与sudoers文件语法利用wheel用户组以免密码的功能处理visudo有限制的命令操作通过别名创建visudosudo的时间间隔问题sudo搭配su的使用方式 Linux 用户身份切换…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...