$convert(集計)
定義
互換性
次の環境でホストされる配置には $convert
を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$convert
の構文は次のとおりです。
{ $convert: { input: <expression>, to: <type expression>, onError: <expression>, // Optional. onNull: <expression> // Optional. } }
$convert
は、次のフィールドを持つドキュメントを取得します。
フィールド | 説明 | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
input | ||||||||||||||||||||||||||||
to | 引数は、以下の数値識別子または文字列識別子のいずれかに変換される有効な式であればどれでもかまいません。
| |||||||||||||||||||||||||||
onError | 任意。サポートされていない型の変換など、変換中にエラーが発生した場合に返される値。引数には任意の有効な式を使用できます。 指定されていない場合、エラーが発生すると操作はエラーをスローし、停止します。 | |||||||||||||||||||||||||||
onNull |
$convert
に加えて、MongoDB は、デフォルトの "onError" および "onNull" の動作が受け入れられる場合、省略形として次の集計演算子を提供します。
動作
ブール値への変換
次の表でブール値に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
---|---|
配列 | true を返します |
バイナリ データ | true を返します |
ブール値 | 何も起こりません。ブール値を返します。 |
コード | true を返します |
日付 | true を返します |
小数点 | Returns true if not zero Return false if zero |
Double | Returns true if not zero Return false if zero |
整数 | Returns true if not zero Return false if zero |
JavaScript | true を返します |
Long | Returns true if not zero Return false if zero |
Max key | true を返します |
MinKey | true を返します |
null |
|
オブジェクト | true を返します |
ObjectId | true を返します |
正規表現 | true を返します |
文字列 | true を返します |
タイムスタンプ | true を返します |
MongoDB のデータ型の詳細については、「BSON types」をご覧ください。
次の表でブール値への変換例を一覧にしています。
例 | 結果 | ||||
---|---|---|---|---|---|
| true | ||||
| false | ||||
| true | ||||
| true | ||||
| false | ||||
| true | ||||
| true | ||||
| true | ||||
| true | ||||
| true | ||||
| null |
整数への変換
次の表で、整数に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
---|---|
ブール値 | Returns 0 for false .Returns 1 for true . |
Double | 切り捨てられた値を返します。 切り捨てられた double 値は、整数値の最小値と最大値の範囲内に収まる必要があります。 切り捨てられた値が最小の整数値より小さい、または最大の整数値より大きい場合、double 値を変換することはできません。 |
小数点 | 切り捨てられた値を返します。 切り捨てられた小数値は、整数の最小値と最大値の範囲内に収まる必要があります。 切り捨てられた値が最小整数値より小さい、または最大整数値より大きい 10 進数値は変換できません。 |
整数 | 何も起こりません。整数値を返します。 |
Long | long 値を整数として返します。 long 値は整数の最小値と最大値の範囲内になければなりません。 最小整数値より小さい、または最大整数値より大きい long 値を変換することはできません。 |
文字列 | 文字列の数値を整数として返します。 文字列の値は 10 進数の整数で(例: 浮動小数、小数、または10 進数以外の数(例: |
次の表に、整数への変換の例をいくつか示します。
例 | 結果 | ||||
---|---|---|---|---|---|
| 1 | ||||
| 0 | ||||
| 1 | ||||
| 5 | ||||
| エラー | ||||
| 5,000 | ||||
| エラー | ||||
| -2 | ||||
| エラー | ||||
| null |
10 進数への変換
以下の表は、10 進数に変換できる入力型の一覧です。
入力タイプ | 動作 |
---|---|
ブール値 | Returns Decimal128( "0" ) for false .Returns Decimal128( "1" ) for true . |
Double | double 値を小数として返します。 |
小数点 | 何も起こりません。小数を返します。 |
整数 | int 値を小数で返します。 |
Long | long 値を小数で返します。 |
文字列 | 文字列の数値を小数で返します。 文字列の値は 10 進数の数値でなければなりません(例: 10 進数以外の数の文字列値は変換できません(例: |
日付 | 日付値に対応する UNIXエポックからのミリ秒数を返します。 |
次の表に 10 進数への変換の例をいくつか示します。
例 | 結果 | ||||
---|---|---|---|---|---|
| Decimal128("1") | ||||
| Decimal128("0") | ||||
| Decimal128("2.50000000000000" ) | ||||
| Decimal128("5") | ||||
| Decimal128("10000") | ||||
| Decimal128("-5.5") | ||||
| Decimal128("1522039108044") |
Double への変換
次の表に、double に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
---|---|
ブール値 | Returns NumberDouble(0) for false .Returns NumberDouble(1) for true . |
Double | 何も処理しません。double を返します。 |
小数点 | 小数値を double として返します。 小数値は、double の最小値と最大値の範囲内に収まる必要があります。 最小の double 値より小さい値、または最大の double 値より大きい値の小数値は変換できません。 |
整数 | int 値を double として返します。 |
Long | long 値を double として返します。 |
文字列 | string の数値を double として返します。 string の値は 10 進数の数値で(例: 10 進数以外の数の string の値(例: |
日付 | 日付値に対応する UNIXエポックからのミリ秒数を返します。 |
次の表に、double への変換の例をいくつか示します。
例 | 結果 | ||||
---|---|---|---|---|---|
| 1 | ||||
| 0 | ||||
| 2.5 | ||||
| 5 | ||||
| 10000 | ||||
| -5.5 | ||||
| 50000000000 | ||||
| 1522039108044 |
Long への変換
次の表で、long に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
---|---|
ブール値 | Returns 0 for false .Returns 1 for true . |
Double | 切り捨てられた値を返します。 切り捨てられた double 値は、long 値の最小値と最大値の範囲内に収まる必要があります。 切り捨てられた値が最小の long 値より小さい、または最大の long 値より大きい場合、double 値を変換することはできません。 |
小数点 | 切り捨てられた値を返します。 切り捨てられた 10 進数値は、long 値の最小値と最大値の範囲内に収まる必要があります。 切り捨てた 10 進数値が最小の long 値より小さい、または最大の long 値より大きい場合、10 進値は変換できません。 |
整数 | 整数値を long として返します。 |
Long | 何も起こりません。long 値を返します。 |
文字列 | 文字列の数値を返します。 文字列値は 10 進数の long 値で(例えば 浮動小数、小数、または 10 進数以外の数(例: |
日付 | Date をUNIXエポックを基準としたミリ秒数に変換します。 |
次の表で long 値への変換例の一部を一覧にしています。
例 | 結果 | ||||
---|---|---|---|---|---|
| Long("1") | ||||
| Long("0") | ||||
| Long("2") | ||||
| Long("5") | ||||
| エラー | ||||
| Long("8") | ||||
| Long("1522039108044") | ||||
| Long("-2") | ||||
| エラー | ||||
| null |
日付への変換
次の表で、日付に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
---|---|
Double | 切り捨てられた double 値で表されるミリ秒数に対応する日付を返します。 正の数は、1970 年 1 月 1 日からのミリ秒数に対応します。 負の数は、1970 年 1 月 1 日より前のミリ秒数に対応します。 |
小数点 | 切り捨てられた小数値で表されるミリ秒数に対応する日付を返します。 正の数は、1970 年 1 月 1 日からのミリ秒数に対応します。 負の数は、1970 年 1 月 1 日より前のミリ秒数に対応します。 |
Long | long 値で表されるミリ秒数に対応する日付を返します。 正の数は、1970 年 1 月 1 日からのミリ秒数に対応します。 負の数は、1970 年 1 月 1 日より前のミリ秒数に対応します。 |
文字列 | 日付文字列 に対応する日付を返します。 文字列は次のような有効な日付文字列でなければなりません。
|
ObjectId | ObjectId のタイムスタンプに対応する日付を返します。 |
タイムスタンプ | タイムスタンプに対応する日付を返します。 |
次の表で、日付への変換例の一部を示します。
例 | 結果 | ||||
---|---|---|---|---|---|
| ISODate("1973-10-20T21:20:00.000Z") | ||||
| ISODate("2009-09-19T14:53:56.000Z") | ||||
| ISODate("2004-11-09T11:33:20.000Z") | ||||
| ISODate("1935-02-22T12:26:40.000Z") | ||||
| ISODate("2018-03-27T04:08:58.000Z") | ||||
| ISODate( "2018-03-03T00:00:00.000Z") | ||||
| ISODate("2018-03-20T06:00:06.000Z") | ||||
| エラー | ||||
| ISODate("2021-11-23T17:21:58.000Z") |
ObjectId への変換
下表には、ObjectId に変換できる入力型が一覧表示されています。
入力タイプ | 動作 |
---|---|
文字列 | 長さ 24 の 16 進文字列の ObjectId を返します。 長さ 24 の 16 進文字列ではない文字列値を変換することはできません。 |
次の表で、日付への変換例の一部を示します。
例 | 結果 | ||||
---|---|---|---|---|---|
| ObjectId("5ab9cbfa31c2ab715d42129e") | ||||
| エラー |
文字列への変換
次の表に、文字列に変換できる入力タイプを示します。
入力タイプ | 動作 |
---|---|
ブール値 | ブール値を文字列として返します。 |
Double | double 値を string として返します。 |
小数点 | 10 進数値を文字列として返します。 |
整数 | 整数値を文字列として返します。 |
Long | long 値を文字列として返します。 |
ObjectId | ObjectId 値を文字列として返します。 |
文字列 | 何も起こりません。文字列値を返します。 |
日付 | 日付を文字列値として返します。 |
次の表に、文字列値への変換の例をいくつか示します。
例 | 結果 | ||||
---|---|---|---|---|---|
| "true" | ||||
| "false" | ||||
| "2.5" | ||||
| "2" | ||||
| "1000" | ||||
| "5ab9c3da31c2ab715d421285" | ||||
| "2018-03-27T16:58:51.538Z" |
例
次のドキュメントを使用してコレクション orders
を作成します。
db.orders.insertMany( [ { _id: 1, item: "apple", qty: 5, price: 10 }, { _id: 2, item: "pie", qty: 10, price: Decimal128("20.0") }, { _id: 3, item: "ice cream", qty: 2, price: "4.99" }, { _id: 4, item: "almonds" }, { _id: 5, item: "bananas", qty: 5000000000, price: Decimal128("1.25") } ] )
orders
コレクションにおける次の集計操作では、 price
を10 進数に変換します。
// Define stage to add convertedPrice and convertedQty fields with // the converted price and qty values. // If price or qty values are missing, the conversion returns a // value of decimal value or int value of 0. // If price or qty values cannot be converted, the conversion returns // a string priceQtyConversionStage = { $addFields: { convertedPrice: { $convert: { input: "$price", to: "decimal", onError: "Error", onNull: Decimal128("0") } }, convertedQty: { $convert: { input: "$qty", to: "int", onError:{ $concat: [ "Could not convert ", { $toString:"$qty" }, " to type integer." ] }, onNull: Int32("0") } }, } }; totalPriceCalculationStage = { $project: { totalPrice: { $switch: { branches: [ { case: { $eq: [ { $type: "$convertedPrice" }, "string" ] }, then: "NaN" }, { case: { $eq: [ { $type: "$convertedQty" }, "string" ] }, then: "NaN" }, ], default: { $multiply: [ "$convertedPrice", "$convertedQty" ] } } } } }; db.orders.aggregate( [ priceQtyConversionStage, totalPriceCalculationStage ])
この操作により、次のドキュメントが返されます。
{ _id: 1, totalPrice: Decimal128("50") }, { _id: 2, totalPrice: Decimal128("200.0") }, { _id: 3, totalPrice: Decimal128("9.98") }, { _id: 4, totalPrice: Decimal128("0") }, { _id: 5, totalPrice: 'NaN' }