sql >> データベース >  >> NoSQL >> MongoDB

MongoDB $roundと$trunc:違いは何ですか?

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

    1. メモリが不足した場合、Redisは何をしますか?

    2. 入力されたフィールドに対するMongoDBクエリ

    3. NodejsMongoをサブドキュメントに挿入-動的フィールド名

    4. SQLでグループの最小値を持つ行を選択する5つの方法