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

MongoDB $ trunc

    MongoDBでは、$trunc 集計パイプライン演算子は、数値を整数または指定された小数点以下の桁数に切り捨てます。

    数値を切り捨てる小数点以下の桁数を指定するオプションがあります。これを行うには、2番目の引数を渡します。最初の引数は切り捨てる数値であり、2番目の(オプションの)引数は切り捨てる小数点以下の桁数です。

    2番目の引数を省略すると、小数点の右側のすべての桁が切り捨てられ、整数値全体が返されます。

    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 }

    $truncを使用できます dataの値を切り捨てる演算子 フィールド:

    db.test.aggregate(
       [
         {
           $project:
              {
                _id: 0,
                data: 1,
                truncated: { $trunc: [ "$data" ] }
              }
         }
       ]
    )

    結果:

    { "data" : 8.99, "truncated" : 8 }
    { "data" : 8.45, "truncated" : 8 }
    { "data" : 8.451, "truncated" : 8 }
    { "data" : -8.99, "truncated" : -8 }
    { "data" : -8.45, "truncated" : -8 }
    { "data" : -8.451, "truncated" : -8 }
    { "data" : 8, "truncated" : 8 }
    { "data" : 0, "truncated" : 0 }

    $truncに注意してください $roundのような数値は丸めません します。 $trunc 演算子は単に数値を切り捨てます。 $roundを適用した場合 このコレクションでは、最初と4番目のドキュメントは9に丸められます。 および-9 それぞれ。

    小数点以下の桁数を指定

    2番目の引数を使用して、数値を切り捨てる小数点以下の桁数を指定するオプションがあります。

    例:

    db.test.aggregate(
       [
         {
           $project:
              {
                _id: 0,
                data: 1,
                truncated: { $trunc: [ "$data", 1 ] }
              }
         }
       ]
    )

    結果:

    { "data" : 8.99, "truncated" : 8.9 }
    { "data" : 8.45, "truncated" : 8.4 }
    { "data" : 8.451, "truncated" : 8.4 }
    { "data" : -8.99, "truncated" : -8.9 }
    { "data" : -8.45, "truncated" : -8.4 }
    { "data" : -8.451, "truncated" : -8.4 }
    { "data" : 8, "truncated" : 8 }
    { "data" : 0, "truncated" : 0 }

    繰り返しますが、これは単に数値を切り捨てます。 $roundを使用した場合 、これらの数値の一部を丸めたはずです。

    負の小数点以下の桁数

    2番目の引数は、-20から100までの整数(排他的)に解決される任意の有効な式にすることができます。したがって、負の小数点以下の桁数を指定できます。

    これを行うと、数値は小数点以下の桁数が切り捨てられます。負の整数の絶対値が小数点以下の桁数よりも大きい場合、結果は0になります。 。

    コレクションに次のドキュメントを追加するとします。

    { "_id" : 9, "data" : 8111.32 }
    { "_id" : 10, "data" : 8514.321 }
    { "_id" : 11, "data" : 8999.454 }

    $truncを適用するときにさまざまな小数点以下の桁数を使用する例を次に示します。 それらのドキュメントへ:

    db.test.aggregate(
       [
         { $match: { _id: { $in: [ 9, 10, 11 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                a: { $trunc: [ "$data", -1 ] },
                b: { $trunc: [ "$data", -2 ] },
                c: { $trunc: [ "$data", -3 ] },
                d: { $trunc: [ "$data", -4 ] },
                e: { $trunc: [ "$data", -5 ] }
              }
         }
       ]
    ).pretty()

    結果:

    {
    	"data" : 8111.32,
    	"a" : 8110,
    	"b" : 8100,
    	"c" : 8000,
    	"d" : 0,
    	"e" : 0
    }
    {
    	"data" : 8514.321,
    	"a" : 8510,
    	"b" : 8500,
    	"c" : 8000,
    	"d" : 0,
    	"e" : 0
    }
    {
    	"data" : 8999.454,
    	"a" : 8990,
    	"b" : 8900,
    	"c" : 8000,
    	"d" : 0,
    	"e" : 0
    }

    ゼロの小数点以下の桁数

    0の小数点以下の桁数を指定する場合 、$trunc 演算子は、小数点の右側のすべての桁を切り捨てて、整数値全体を返します。

    例:

    db.test.aggregate(
       [
         {
           $project:
              {
                _id: 0,
                data: 1,
                truncated: { $trunc: [ "$data", 0 ] }
              }
         }
       ]
    )

    結果:

    { "data" : 8.99, "truncated" : 8 }
    { "data" : 8.45, "truncated" : 8 }
    { "data" : 8.451, "truncated" : 8 }
    { "data" : -8.99, "truncated" : -8 }
    { "data" : -8.45, "truncated" : -8 }
    { "data" : -8.451, "truncated" : -8 }
    { "data" : 8, "truncated" : 8 }
    { "data" : 0, "truncated" : 0 }
    { "data" : 8111.32, "truncated" : 8111 }
    { "data" : 8514.321, "truncated" : 8514 }
    { "data" : 8999.454, "truncated" : 8999 }

    数値タイプ

    切り捨てる数値は、整数、double、10進数、またはlongに解決される任意の有効な式にすることができます。戻り値は入力値のデータ型と一致します。

    したがって、次のドキュメントをコレクションに追加すると、次のようになります。

    { "_id" : 12, "data" : NumberDecimal("128.4585") }
    { "_id" : 13, "data" : NumberDecimal("128.12345678912") }

    $truncを適用できます dataに フィールド:

    db.test.aggregate(
       [
         { $match: { _id: { $in: [ 12, 13 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                a: { $trunc: [ "$data", -1 ] },
                b: { $trunc: [ "$data", 0 ] },
                c: { $trunc: [ "$data", 3 ] },
                d: { $trunc: [ "$data", 4 ] },
                e: { $trunc: [ "$data", 5 ] }
              }
         }
       ]
    ).pretty()

    結果:

    {
    	"data" : NumberDecimal("128.4585"),
    	"a" : NumberDecimal("1.2E+2"),
    	"b" : NumberDecimal("128"),
    	"c" : NumberDecimal("128.458"),
    	"d" : NumberDecimal("128.4585"),
    	"e" : NumberDecimal("128.45850")
    }
    {
    	"data" : NumberDecimal("128.12345678912"),
    	"a" : NumberDecimal("1.2E+2"),
    	"b" : NumberDecimal("128"),
    	"c" : NumberDecimal("128.123"),
    	"d" : NumberDecimal("128.1234"),
    	"e" : NumberDecimal("128.12345")
    }

    小数点以下の桁数をゼロにする

    2番目の引数がnullの場合 、結果はnullです 。

    例:

    db.test.aggregate(
       [
         { $match: { _id: { $in: [ 1, 2, 3 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                truncated: { $trunc: [ "$data", null ] }
              }
         }
       ]
    )

    結果:

    { "data" : 8.99, "truncated" : null }
    { "data" : 8.45, "truncated" : null }
    { "data" : 8.451, "truncated" : null }

    ヌル値の切り捨て

    切り捨てられる値がnullの場合 、結果はnullです 。

    次のドキュメントをコレクションに追加するとします。

    { "_id" : 14, "data" : null }

    そして、$truncを使用します null値を切り捨てるには:

    db.test.aggregate(
       [
         { $match: { _id: { $in: [ 14 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                truncated: { $trunc: [ "$data", null ] }
              }
         }
       ]
    )

    結果:

    { "data" : null, "truncated" : null }

    インフィニティの切り捨て

    切り捨てられる数値がInfinityの場合 、結果はInfinity 。同様に、-Infinityの場合 、結果は-Infinityです。 。

    そのような値を持つ2つのドキュメントを追加しましょう:

    { "_id" : 15, "data" : Infinity }
    { "_id" : 16, "data" : -Infinity }

    そして、それらを切り捨てましょう:

    db.test.aggregate(
       [
         { $match: { _id: { $in: [ 15, 16 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                truncated: { $trunc: [ "$data", 2 ] }
              }
         }
       ]
    )

    結果:

    { "data" : Infinity, "truncated" : Infinity }
    { "data" : -Infinity, "truncated" : -Infinity }

    NaNの切り捨て

    NaNの切り捨て 結果はNaN

    db.test.aggregate(
       [
         { $match: { _id: { $in: [ 1, 2 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                truncated: { $trunc: [ "$data" * 2 ] }
              }
         }
       ]
    )

    結果:

    { "data" : 8.99, "truncated" : NaN }
    { "data" : 8.45, "truncated" : NaN }

    非数値タイプ

    間違ったデータ型の値(つまり、整数、double、10進数、またはlongではない)を切り捨てようとすると、エラーが返されます。

    コレクションに次のドキュメントを追加するとします。

    { "_id" : 17, "data" : "Thirty five" }

    そして今、dataを切り捨てようとしています フィールド:

    db.test.aggregate(
       [
         { $match: { _id: { $in: [ 17 ] } } },
         {
           $project:
              {
                _id: 0,
                data: 1,
                truncated: { $trunc: [ "$data" ] }
              }
         }
       ]
    )

    結果:

    uncaught exception: Error: command failed: {
    	"ok" : 0,
    	"errmsg" : "$trunc only supports numeric types, not string",
    	"code" : 51081,
    	"codeName" : "Location51081"
    } : aggregate failed :
    [email protected]/mongo/shell/utils.js:25:13
    [email protected]/mongo/shell/assert.js:18:14
    [email protected]/mongo/shell/assert.js:639:17
    [email protected]/mongo/shell/assert.js:729:16
    [email protected]/mongo/shell/db.js:266:5
    [email protected]/mongo/shell/collection.js:1058:12
    @(shell):1:1

    1. MongoDB-テキストフィールドのインデックスとテキストインデックスの違いは?

    2. MongoDBでユーザーと認証を管理する方法

    3. クラス'MongoDB\ Driver\Manager'が見つかりません

    4. RuntimeWarning:スーパーユーザー権限でワーカーを実行しています:これは絶対にお勧めしません