MongoDB聚合运算符:$trunc

MongoDB聚合运算符:$trunc

文章目录

$trunc聚合运算符用于将数字截断为整数或指定的小数位。

语法

js 复制代码
{ $trunc : [ <number>, <place> ] }

参数字段

  • <numer>:数值类型,可以是任何能够解析为数值的表达式,比如是整数、双精度数、小数或长整数。如果解析为非表达式,则返回错误。
  • <place>:整数,可选字段,可以是任何可被解析为整数的表达式,必须在-20到100之间,也就是:-20< place < 100,如果不指定,缺省值为0。
    • 如果<place>被解析为正整数,$trunc四舍五入到<place>小数位。如:$trunc: [1234.5678, 2]保留两位小数,返回1234.56
    • 如果<place>解析为一个负整数,$trunc使用小数点左边的数字 <place> 进行截取。例如$trunc : [1234.5678, -2]应用到小数点左边的第二位数字 (3) 并返回 1200。如果<place>的绝对值等于或超过小数点左边的位数,则$trunc返回0。例如:$trunc : [ 1234.5678, -5]指定到了小数位左边的第5位,大于小数点左边的数字位数,所以返回0。
    • 如果<place>解析为0,$trunc对小数位右边第一位数字进行截取,返回整数部分。如:$trunc : [1234.5678, 0]返回1234

使用

$trunc不会对截断的数据进行舍入。要将输入值舍入到指定位置,可使用 $round表达式。

返回的数据类型

如果截断到特定的小数位,$trunc返回的数据类型与输入表达式或值的数据类型一致,如果截断到整数位,$trunc返回整数。

null, NaN, 和 正/负无穷

  • 如果第一个参数解析为 null 值或引用缺少的字段,则 $trunc 返回 null
  • 如果第一个参数解析为 NaN,则 $trunc 返回 NaN
  • 如果第一个参数解析为负无穷大或正无穷大,则 $trunc 分别返回负无穷大或正无穷大。

|例子|结果|

|=|-|

|{ $trunc: [ NaN, 1] }|NaN|

|{ $trunc: [ null, 1] }|null|

|{ $trunc : [ Infinity, 1 ] }|Infinity|

|{ $trunc : [ -Infinity, 1 ] }|-Infinity|

举例

使用下面脚本创建samples集合:

js 复制代码
db.samples.insertMany(
   [
     { _id: 1, value: 19.25 },
     { _id: 2, value: 28.73 },
     { _id: 3, value: 34.32 },
     { _id: 4, value: -45.39 }
   ]
)
  • 下面的聚合返回值截取到小数点后第一位:
js 复制代码
db.samples.aggregate([
   { $project: { truncatedValue: { $trunc: [ "$value", 1 ] } } }
])

操作返回下面的结果:

json 复制代码
{ "_id" : 1, "truncatedValue" : 19.2 }
{ "_id" : 2, "truncatedValue" : 28.7 }
{ "_id" : 3, "truncatedValue" : 34.3 }
{ "_id" : 4, "truncatedValue" : -45.3 }
  • 下面的聚合返回截断到小数点左边的第一位数字的值:
js 复制代码
db.samples.aggregate([
   { $project: { truncatedValue: { $trunc: [ "$value", -1 ] } } }
])

操作返回下面的结果:

json 复制代码
{ "_id" : 1, "truncatedValue" : 10 }
{ "_id" : 2, "truncatedValue" : 20 }
{ "_id" : 3, "truncatedValue" : 30 }
{ "_id" : 4, "truncatedValue" : -40 }
  • 下面的聚合会返阶段为整数的值:
js 复制代码
db.samples.aggregate([
   { $project: { truncatedValue: { $trunc: [ "$value", 0 ] } } }
])

操作返回下面的结果:

json 复制代码
{ "_id" : 1, "truncatedValue" : 19 }
{ "_id" : 2, "truncatedValue" : 28 }
{ "_id" : 3, "truncatedValue" : 34 }
{ "_id" : 4, "truncatedValue" : -45 }
相关推荐
憧憬成为web高手2 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学2 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh4 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z123456789865 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD5 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward6 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记6 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发7 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB7 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
欲速不达88207 小时前
Mysql并发DML锁等待的优化
数据库·mysql