MongoDBの集約パイプラインフレームワークには、$round
が含まれています 演算子と$trunc
オペレーター。これらのオペレーターは、類似していますが異なるタスクを実行します。
定義
まず、各演算子の定義を見てみましょう。
-
$round
演算子ラウンド 整数または指定された小数点以下の桁数。 -
$truncate
演算子切り捨て 整数または指定された小数点以下の桁数。
基本的に、違いはラウンドという言葉にあります vs切り捨て 。
場合によっては、両方の演算子が同じ結果を返します。それ以外の場合、結果は異なります。これは、$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
の結果を生成するパーツ 。
負の端数の場所
どちらの演算子も、オプションの2番目の引数を受け入れます。存在する場合、この引数は、数値を丸め/切り捨てる小数点以下の桁数を指定します。
この2番目の引数を指定すると、2つの演算子の違いをさらに強調できます。
例:
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 }
ここでも、同じ結果とそうでない結果があることがわかります。
負の端数の場所
どちらの演算子も、2番目の引数に負の値を受け入れます。
例:
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 }
今回は、2人のオペレーターによって生成された結果の間にはっきりとした対照があります。 $trunc
オペレーターが生成した0
$round
の間、すべてのドキュメントに対して 演算子はさまざまな値を返しましたが、そのほとんどは切り上げまたは切り下げられました。
$floorと$ceil
このような操作を実行するときに注意すべきもう2つの演算子は、$floor
です。 および$ceil
。これらの演算子は同じように機能しますが、わずかに異なります。
-
$floor
最大を返します 指定された数以下の整数 -
$ceil
最小を返します 指定された数以上の整数。