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 }
相关推荐
搬码红绿灯2 分钟前
MySQL主从复制深度解析:原理、架构与实战部署指南
数据库·mysql·架构
呼拉拉呼拉4 分钟前
Redis高可用架构
数据库·redis·架构·高可用架构
却尘4 分钟前
当全世界都在用 Rust 重写一切时,Prisma 却选择了反方向
前端·数据库·orm
藥瓿锻14 分钟前
2024 CKA题库+详尽解析| 15、备份还原Etcd
linux·运维·数据库·docker·容器·kubernetes·cka
远方160926 分钟前
16-Oracle 23 ai-JSON-Relational Duality-知识准备
数据库·oracle·json
Wooden-Flute31 分钟前
七、数据库的完整性
数据库·oracle
珹洺1 小时前
数据库系统概论(十七)超详细讲解数据库规范化与五大范式(从函数依赖到多值依赖,再到五大范式,附带例题,表格,知识图谱对比带你一步步掌握)
java·数据库·sql·安全·oracle
TDengine (老段)1 小时前
TDengine 开发指南——无模式写入
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
TDengine (老段)1 小时前
TDengine 在电力行业如何使用 AI ?
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
观无2 小时前
redis分布式锁
数据库·redis·分布式