定義
互換性
次の環境でホストされる配置には $convert を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
バージョン8.3で変更。
{ $convert: { input: <expression>, to: <type expression> || { type: <type expression>, subtype: <int> }, base: <expression>, // new in 8.3 format: <string>, onError: <expression>, onNull: <expression> } }
$convert 次のフィールドが含まれるドキュメントについて、
フィールド | 必要性 | 説明 | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 必須 | 引数には任意の有効な式を使用できます。 式の詳細については、「式 」を参照してください。 MongoDB 8.1 以降では、
MongoDB8.3 以降では、 MongoDB は、値を | ||||||||||||||||||||||||||||||||||||
| 必須 |
| ||||||||||||||||||||||||||||||||||||
| オブジェクトとして | 引数は、以下の数値識別子または文字列識別子のいずれかに変換される有効な式であればどれでもかまいません。
| ||||||||||||||||||||||||||||||||||||
| 任意 |
デフォルト: 0(汎用バイナリのサブタイプ) | ||||||||||||||||||||||||||||||||||||
| 任意 |
| ||||||||||||||||||||||||||||||||||||
| 任意 | string 型と数値型間の変換の整数基数。
バージョン8.3の新機能。 | ||||||||||||||||||||||||||||||||||||
|
|
| ||||||||||||||||||||||||||||||||||||
| 任意 | 変換中にエラーが発生した場合に返される値。サポートされていない型の変換などが含まれます。引数には任意の有効な式を使用できます。 指定されていない場合、エラーが発生すると操作はエラーをスローし、停止します。 | ||||||||||||||||||||||||||||||||||||
| 任意 |
$convertに加えて、MongoDB は、デフォルトの "onError" および "onNull" の動作が受け入れられる場合、省略形として次の集計演算子を提供します。
動作
次のセクションでは、値を別の型に変換する方法について説明します。
BinData への変換
MongoDB 8.1 以降では、inputフィールドを次のいずれかのタイプに設定すると、toフィールドを binData に設定できます。
intlongdouble
MongoDB 8.1 以降では、異なる binData サブタイプ間で変換を試みると、$convert はエラーを返します。MongoDB 8.0 では、$convert は元の値と元のサブタイプを返します。変換は実行されません。8.0 より前のMongoDBバージョンには binData 変換はありません。
数値型から binData に変換する:
数値型を binData に変換する場合:
intは 4 バイトのbinDataになります。longは 8 バイトのbinDataになります。doubleは 8 バイトのbinDataになります。
数値出力の byteOrder はデフォルトで "リトル" 、つまり最下位バイトが先の配置になります。対照的に、"big" は最上位バイトを先頭に配置します。
long を binData に変換する:
入力:
db.t.insertOne( { a: Long(42) } )
db.t.aggregate([ { $project: { _id: 0, convertedBD: { $convert: { input: "$a", to: "binData", } }, } } ])
出力:
[ { convertedBD: Binary.createFromBase64('KgAAAAAAAAA=', 0) } ]
ビッグエンディアン バイト順で long を binData に変換する:
入力:
db.t.insertOne( { a: Long(42) } )
db.t.aggregate([ { $project: { _id: 0, convertedBD: { $convert: { input: "$a", to: "binData", byteOrder: "big", } }, } } ])
出力:
[ { convertedBD: Binary.createFromBase64('AAAAAAAAACo=', 0), } ]
double を binData に変換する:
入力:
db.t.insertOne( { a: Double(42.0) } )
db.t.aggregate([ { $project: { _id: 0, convertedBD: { $convert: { input: "$a", to: "binData", } }, } } ])
出力:
[ { convertedBD: Binary.createFromBase64('AAAAAAAARUA=', 0) } ]
int を binData に変換する:
入力:
db.t.insertOne( { a: 42 } )
db.t.aggregate([ { $project: { _id: 0, convertedBD: { $convert: { input: "$a", to: "binData", } }, } } ])
出力:
[ { convertedBD: Binary.createFromBase64('KgAAAA==', 0) } ]
数値の配列を binData に変換する:
この例では、$convert がさまざまなタイプの数値を含む配列を binData に変換する方法を示しています。
入力:
db.t.insertMany([ // Empty array { a: [ ] }, // Bool array { a: [ false, true, true, true, true, true, true, true, false, false, false, false, false, true, true, true ] }, // Int array { a: [NumberInt(0), NumberInt(1), NumberInt(0), NumberInt(10)] }, // Double array { a: [ Double(0.0), Double(1.0), Double(0.0), Double(1.0), Double(3.14) ] }, ])
db.t.aggregate([ { $project: { _id: 0, original: "$a", convertedVector: { $convert: { input: "$a", to: { type: "binData" } } } } } ])
出力:
[ { original: [], convertedVector: Binary.fromPackedBits(new Uint8Array([])) }, { original: [ false, true, true, true, true, true, true, true, false, false, false, false, false, true, true, true ], convertedVector: Binary.fromPackedBits(new Uint8Array([ 127, 7 ])) }, { original: [ 0, 1, 0, 10 ], convertedVector: Binary.fromInt8Array(new Int8Array([ 0, 1, 0, 10 ])) }, { original: [ 0, 1, 0, 1, 3.14 ], convertedVector: Binary.fromFloat32Array(new Float32Array([ 0, 1, 0, 1, 3.140000104904175 ])) } ]
string から BinData への変換
MongoDB は、binData と string の間の変換もサポートしています。
次の例は、string を binData に変換する方法を示しています。
例 | 結果 | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| | |||||||||||
| | |||||||||||
| | |||||||||||
| | |||||||||||
| | |||||||||||
| | |||||||||||
| |
注意
MongoDB 8.1 以降では、異なる binData サブタイプ間で変換を試みると、$convert はエラーを返します。MongoDB 8.0 では、$convert は元の値と元のサブタイプを返します。変換は実行されません。8.0 より前のMongoDBバージョンには binData 変換はありません。
配列への変換
バージョン8.3の新機能。
次の表で、配列に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
|---|---|
binData | 数値の配列を返します。 配列要素の数値型は、 binData形式によって異なります。 |
文字列 | string 内の内容に対応する配列を返します。 |
null または欠落 | null を返します。 |
次の表に、string を配列に変換する例をいくつか示します。
例 | 結果 | ||
|---|---|---|---|
| [ 1, 2, 3 ] | ||
| [ 'a', 'b', 'c' ] | ||
| [ ] | ||
| エラー: 入力が予想されるタイプの「配列」と一致しません | ||
| エラー: $convert で onError 値がない場合、int から配列への変換がサポートされていません | ||
| エラー: 入力は有効なJSONを表しません : 予期しないスタンドアロン値 | ||
| [ { '$oid': '507f1f77bcf86cd799439011' } ] | ||
| [ 1, 2, 3 ] 注意
| ||
| 'on error!' | ||
| 'on null!' |
binData を配列に変換する
次の例では、$convert が異なる形式の binData をそれぞれの型の値を含む配列に変換する方法を示しています。
入力:
db.t.insertMany([ // Empty PACKED_BIT vector converts to empty array { v: BinData(9, "EAA=") }, // PACKED_BIT vector converts to bool array { v: BinData(9, "EAB/Bw==") }, // INT8 vector converts to int array { v: BinData(9, "AwAAAQ==") }, // FLOAT32 vector converts to double array { v: BinData(9, "JwCamZk+") }, // FLOAT32 vector with special values converts to [-Infinity, 0, Infinity] { v: BinData(9, "JwAAAID/AAAAAAAAgH8=") } ])
db.t.aggregate([ { $project: { _id: 0, original: "$v", asArray: { $convert: { input: "$v", to: { type: "array" } } } } } ])
出力:
[ { original: Binary.fromPackedBits(new Uint8Array([])), asArray: [] }, { original: Binary.fromPackedBits(new Uint8Array([ 127, 7 ])), asArray: [ false, true, true, true, true, true, true, true, false, false, false, false, false, true, true, true ] }, { original: Binary.fromInt8Array(new Int8Array([ 0, 1 ])), asArray: [ 0, 1 ] }, { original: Binary.fromFloat32Array(new Float32Array([ 0.30000001192092896 ])), asArray: [ 0.30000001192092896 ] }, { original: Binary.fromFloat32Array(new Float32Array([ -Infinity, 0, Infinity ])), asArray: [ -Infinity, 0, Infinity ] } ]
オブジェクトへの変換
バージョン8.3の新機能。
次の表は、オブジェクトに変換できる入力型を一覧表示したものです。
入力タイプ | 動作 |
|---|---|
文字列 | string 内の内容に対応するドキュメントを返します。 |
null または欠落 | null を返します。 |
次の表に、オブジェクトへの変換の例をいくつか示します。
例 | 結果 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| { a: 1, b: 2 } | ||||||||
| { } | ||||||||
| エラー: 入力は予想される型「オブジェクト」と一致しません | ||||||||
| エラー: 入力は有効なJSONを表しません : 予期しないスタンドアロン値 | ||||||||
| エラー: 入力は有効なJSONを表しません : 埋め込み null バイトは無効 | ||||||||
| { name: 'fex00o' } | ||||||||
| { a: 3, b: 2 } | ||||||||
| { foo: null } | ||||||||
| { foo: false } | ||||||||
| { ['__proto__']: { foo: null } } | ||||||||
| { foo: 'NaN' } | ||||||||
| { foo: 123 } | ||||||||
| { foo: Long('4294967296') } | ||||||||
| { foo: 1.123123 } | ||||||||
| { foo: 1200 } | ||||||||
| {LargePos:18446744073709552000 } | ||||||||
| {LargeNetg: -18446744073709552000 } | ||||||||
| null | ||||||||
| { objectId: '507f1f77bcf86cd799439011', uuid: '3b241101-e2bb-4255-8caf-4136c566a962', date: '2018-03-27T16:58:51.538Z', regex: '/^ABC/i', js: 'function (s) {return s + "foo";}', timestamp: 'Timestamp(1565545664, 1)', arr: [ 1, 2, 3 ] } |
ブール値に変換
次の表でブール値に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
|---|---|
配列 | 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. |
BinData |
|
Double | 切り捨てられた値を返します。 切り捨てられた double 値は、整数値の最小値と最大値の範囲内に収まる必要があります。 切り捨てられた値が最小の整数値より小さい、または最大の整数値より大きい場合、double 値を変換することはできません。 |
小数点 | 切り捨てられた値を返します。 切り捨てられた小数値は、整数の最小値と最大値の範囲内に収まる必要があります。 切り捨てられた値が最小整数値より小さい、または最大整数値より大きい 10 進数値は変換できません。 |
整数 | 何も起こりません。整数値を返します。 |
Long | long 値を整数として返します。 long 値は整数の最小値と最大値の範囲内になければなりません。 最小整数値より小さい、または最大整数値より大きい long 値を変換することはできません。 |
文字列 | 文字列の数値を整数として返します。
|
次の表に、整数への変換の例をいくつか示します。
例 | 結果 | |||||
|---|---|---|---|---|---|---|
| 1 | |||||
| 0 | |||||
| 1 | |||||
| 5 | |||||
| エラー | |||||
| 5,000 | |||||
| エラー | |||||
| -2 | |||||
| エラー | |||||
| null | |||||
| 1048576 | |||||
| -1763180545 | |||||
| エラー: 長さが無効であるため、BinData の変換に失敗しました: 7 |
10 進数に変換
以下の表は、10 進数に変換できる入力型の一覧です。
入力タイプ | 動作 |
|---|---|
ブール値 | Returns Decimal128( "0" ) for false.Returns Decimal128( "1" ) for true. |
Double | double 値を小数として返します。 |
小数点 | 何も起こりません。小数を返します。 |
整数 | int 値を小数で返します。 |
Long | long 値を小数で返します。 |
文字列 | 文字列の数値を小数で返します。
|
日付 | 日付値に対応する 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. |
BinData |
|
Double | 何も処理しません。double を返します。 |
小数点 | 小数値を double として返します。 小数値は、double の最小値と最大値の範囲内に収まる必要があります。 最小の double 値より小さい値、または最大の double 値より大きい値の小数値は変換できません。 |
整数 | int 値を double として返します。 |
Long | long 値を double として返します。 |
文字列 | string の数値を double として返します。
|
日付 | 日付値に対応する UNIXエポックからのミリ秒数を返します。 |
次の表に、double への変換の例をいくつか示します。
例 | 結果 | |||||
|---|---|---|---|---|---|---|
| 1 | |||||
| 0 | |||||
| 2.5 | |||||
| 5 | |||||
| 10000 | |||||
| -5.5 | |||||
| 50000000000 | |||||
| 1522039108044 | |||||
| 4.814824932714571e-36 | |||||
| エラー: 長さが無効であるため、binData の変換に失敗しました: 2 |
非正規数
MongoDB8.3 以降、サーバーは表現可能なすべての倍精度浮動点数の全範囲を解析できます。これには、最上位桁の先頭にゼロがあり、指数の値が最小である非正規数が含まれます。詳細については、 非正規数 を参照してください。
MongoDBの以前のバージョンでは、これらの数値を解析しようとすると、サーバーはエラーを返します。次の例ではMongoDB 8.3 より前のバージョンでエラーを発生させます。
db.t.insertOne( { v: "7.08263e-317" } ) db.t.aggregate([ { $project: { converted: { $convert: { input: "$v", to: "double" }, } } } ])
この例は失敗し、次のようなエラーが発生します。
MongoServerError[ConversionFailure]: Executor error during aggregate command on namespace: test.t :: caused by :: Failed to parse number '7.08263e-317' in $convert with no onError value: Out of range
Long への変換
次の表で、long に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
|---|---|
ブール値 | Returns 0 for false.Returns 1 for true. |
BinData |
|
Double | 切り捨てられた値を返します。 切り捨てられた double 値は、long 値の最小値と最大値の範囲内に収まる必要があります。 切り捨てられた値が最小の long 値より小さい、または最大の long 値より大きい場合、double 値を変換することはできません。 |
小数点 | 切り捨てられた値を返します。 切り捨てられた 10 進数値は、long 値の最小値と最大値の範囲内に収まる必要があります。 切り捨てた 10 進数値が最小の long 値より小さい、または最大の long 値より大きい場合、10 進値は変換できません。 |
整数 | 整数値を long として返します。 |
Long | 何も起こりません。long 値を返します。 |
文字列 | 文字列の数値を返します。
|
日付 | Date をUNIXエポックを基準としたミリ秒数に変換します。 |
次の表で long 値への変換例の一部を一覧にしています。
例 | 結果 | |||||
|---|---|---|---|---|---|---|
| Long("1") | |||||
| Long("0") | |||||
| Long("2") | |||||
| Long("5") | |||||
| エラー | |||||
| Long("8") | |||||
| Long("1522039108044") | |||||
| Long("-2") | |||||
| エラー | |||||
| null | |||||
| Long("1048576") |
日付に変換
次の表で、日付に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
|---|---|
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") | ||||
| エラー |
文字列への変換
次の表に、文字列に変換できる入力タイプを示します。
入力タイプ | 動作 |
|---|---|
配列 | を バージョン8.3の新機能。 |
BinData |
|
ブール値 | ブール値を string として返します。 |
日付 | を |
小数点 |
|
Double |
|
整数 |
|
Long |
|
Max key | を バージョン8.3の新機能。 |
MinKey | を バージョン8.3の新機能。 |
オブジェクト | オブジェクトを string として返します。 バージョン8.3の新機能。 |
ObjectId |
|
正規表現 | を バージョン8.3の新機能。 |
文字列 | 操作はありません 。 string 値を返します。 |
タイムスタンプ | を バージョン8.3の新機能。 |
注意
次の表に、文字列値への変換の例をいくつか示します。
例 | 結果 | ||||||
|---|---|---|---|---|---|---|---|
| "true" | ||||||
| "false" | ||||||
| "2.5" | ||||||
| "2" | ||||||
| "1000" | ||||||
| "5ab9c3da31c2ab715d421285" | ||||||
| "2018-03-27T16:58:51.538Z" | ||||||
| 'hn3f' | ||||||
| "invalid" |
例
基本変換の例
プレースホルダードキュメントを含むコレクションexamples を作成します。
db.examples.insertOne({ _id: 1 })
次の例では、異なる基数を使用して数値と string を変換します。
db.examples.aggregate([ { $project: { _id: 0, bin: { $convert: { input: 10, to: "string", base: 2 } }, hex: { $convert: { input: 10, to: "string", base: 16 } }, intFromBin: { $convert: { input: "1010", to: "int", base: 2 } }, intFromHex: { $convert: { input: "A", to: "int", base: 16 } } } } ])
この操作、次のドキュメントが返されます。
{ bin: "1010", hex: "A", intFromBin: 10, intFromHex: 10 }
タイプ変換の例
次のドキュメントを使用してコレクション 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' }
詳細
を使用して値を配列に変換する
$toArrayを使用して string をオブジェクトに変換する
$toObjectを使用して値をブール値に変換する
$toBoolを使用して値を整数に変換する
$toIntを使用して値を小数に変換します
$toDecimalを使用して値を double に変換します
$toDoubleを使用して値を long に変換する
$toLongを使用して値を日付に変換する
$toDateを使用して値を ObjectId に変換する
$toObjectIdを使用して値を string に変換する
$toStringを使用して日付 string を日付オブジェクトに変換する
$dateFromStringを使用して日付オブジェクトを string に変換する
$dateToString