MongoDB $round vs $trunc:有什么区别?
MongoDB的聚合管道框架包括一个运算符和一个运算符。这些运算符执行类似但不同的任务。[$round](https://database.guide/mongodb-round/ "MongoDB $round")``[$trunc](https://database.guide/mongodb-trunc/ "MongoDB $trunc")
定义
首先,让我们看一下每个运算符的定义:
- 运算符_将数字舍入_为整数或指定的小数位。
$round - 运算符_将数字截断_为整数或指定的小数位。
$truncate
基本上,区别在于_单词 round_与_截断_。
在某些情况下,两个运算符将返回相同的结果。在其他情况下,它们的结果会有所不同。这是因为运算符可能会根据值向上舍入数字。运算符不对数字进行四舍五入。相反,它只是截断它。换句话说,它只是按照指定的数字削减,同时保留剩余的数字。$round``$truncate
例
假设我们有一个包含以下文档的集合:test
{ “_id” : 1, “data” : 8.99 } { “_id” : 2, “data” : 8.45 } { “_id” : 3, “data” : 8.451 } { “_id” : 4, “data” : -8.99 } { “_id” : 5, “data” : -8.45 } { “_id” : 6, “data” : -8.451 } { “_id” : 7, “data” : 8 } { “_id” : 8, “data” : 0 } { “_id” : 9, “data” : 0.5 } { “_id” : 10, “data” : 8111.32 } { “_id” : 11, “data” : 8514.321 } { “_id” : 12, “data” : 8999.454 }
以下是我们申请和这些文件时发生的情况:$round``$truncate
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] },
truncated: { $trunc: [ "$data" ] }
}
}
]
)
结果:
{ “data” : 0, “rounded” : 0, “truncated” : 0 } { “data” : 8, “rounded” : 8, “truncated” : 8 } { “data” : 0.5, “rounded” : 0, “truncated” : 0 } { “data” : 0.9, “rounded” : 1, “truncated” : 0 } { “data” : 8.99, “rounded” : 9, “truncated” : 8 } { “data” : 8.45, “rounded” : 8, “truncated” : 8 } { “data” : 8.451, “rounded” : 8, “truncated” : 8 } { “data” : -8.99, “rounded” : -9, “truncated” : -8 } { “data” : -8.45, “rounded” : -8, “truncated” : -8 } { “data” : -8.451, “rounded” : -8, “truncated” : -8 }
我们可以看到,在某些情况下,结果是相同的。在其他情况下,情况有所不同。例如,当输入值为 时,运算符将数字向上舍入为 。另一方面,操作员只需移除零件,即可产生 .0.9``$round``1``$truncate``.9``0
负小数位
两个运算符都接受可选的第二个参数。如果存在,此参数指定要将数字舍入/截断到的小数位数。
提供第二个参数可以进一步突出两个运算符之间的差异。
例:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 1 ] },
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
结果:
{ “data” : 0, “rounded” : 0, “truncated” : 0 } { “data” : 8, “rounded” : 8, “truncated” : 8 } { “data” : 0.5, “rounded” : 0.5, “truncated” : 0.5 } { “data” : 0.9, “rounded” : 0.9, “truncated” : 0.9 } { “data” : 8.99, “rounded” : 9, “truncated” : 8.9 } { “data” : 8.45, “rounded” : 8.4, “truncated” : 8.4 } { “data” : 8.451, “rounded” : 8.5, “truncated” : 8.4 } { “data” : -8.99, “rounded” : -9, “truncated” : -8.9 } { “data” : -8.45, “rounded” : -8.4, “truncated” : -8.4 } { “data” : -8.451, “rounded” : -8.5, “truncated” : -8.4 }
同样,我们可以看到有些结果是相同的,而另一些则不是。
负小数位
两个运算符都接受第二个参数的负值。
例:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", -1 ] },
truncated: { $trunc: [ "$data", -1 ] }
}
}
]
)
结果:
{ “data” : 0, “rounded” : 0, “truncated” : 0 } { “data” : 8, “rounded” : 10, “truncated” : 0 } { “data” : 0.5, “rounded” : 0, “truncated” : 0 } { “data” : 0.9, “rounded” : 0, “truncated” : 0 } { “data” : 8.99, “rounded” : 10, “truncated” : 0 } { “data” : 8.45, “rounded” : 10, “truncated” : 0 } { “data” : 8.451, “rounded” : 10, “truncated” : 0 } { “data” : -8.99, “rounded” : -10, “truncated” : 0 } { “data” : -8.45, “rounded” : -10, “truncated” : 0 } { “data” : -8.451, “rounded” : -10, “truncated” : 0 }
这一次,两个运营商产生的结果形成了鲜明的对比。运算符为每个文档生成,而运算符返回各种值,其中大部分值向上或向下舍入。$trunc``0``$round
$floor和$ceil
执行此类操作时需要注意的另外两个运算符是 和 。这些运算符的工作方式相似,但略有不同。[$floor](https://database.guide/mongodb-floor/ "MongoDB $floor")``[$ceil](https://database.guide/mongodb-ceil/ "MongoDB $ceil")
$floor返回小于或等于指定数字_的最大整数_$ceil返回大于或等于指定数字的_最小_整数。