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返回大于或等于指定数字的_最小_整数。