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