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最小を返します 指定された数以上の整数。