定義
互換性
次の環境でホストされる配置には $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 以降では、
MongoDB 8.3以降では、 MongoDB は、値を MongoDB 9.0以降では、 |
| 必須 |
|
| オブジェクトとして | |
| 任意 |
|
| 任意 |
|
| 任意 | string 型と数値型間の変換の整数基数。
バージョン8.3の新機能。 |
|
|
|
| 任意 | 変換中にエラーが発生した場合に返される値。サポートされていない型の変換などが含まれます。引数には任意の有効な式を使用できます。 指定されていない場合、エラーが発生すると操作はエラーをスローし、停止します。 |
| 任意 |
$convertに加えて、MongoDB は、デフォルトの "onError" および "onNull" の動作が受け入れられる場合、省略形として次の集計演算子を提供します。
タイプ識別子
to.typeフィールドは、次の数値識別子と string 識別子を受け入れます。
文字列識別子 | 数値識別子 | ノート |
|---|---|---|
"double" | 1 | 詳細については、double への変換を参照してください。 |
"string" | 2 | 「String への変換」を参照してください。 |
"object" | 3 | オブジェクトへの変換を参照してください。 |
"array" | 4 | 「配列へ変換」を参照してください。 |
"binData" | 5 | BinData への変換を参照してください。 |
"objectId" | 7 | ObjectId への変換 を参照してください。 |
"bool" | 8 | 「ブール値に変換」を参照してください。 |
"date" | 9 | 「日付に変換」を参照してください。 |
"int" | 16 | 整数への変換を参照してください。 |
"long" | 18 | 「Long への変換」を参照してください。 |
"decimal" | 19 | 「10 進数に変換」を参照してください。 |
バイナリ サブタイプ
次の表に、to.subtype フィールドの有効な値を示します。
番号 | 説明 |
|---|---|
0 | 汎用バイナリのサブタイプ |
1 | 関数データ |
2 | バイナリ(旧) |
3 | UUID(旧) |
4 | UUID |
5 | MD5 |
6 | 暗号化された BSON 値 |
7 | 圧縮された時系列データ バージョン5.2の新機能。 |
8 | キーやシークレットなどの機密データ。 MongoDB では、サブタイプ 8 のバイナリ データのリテラル値はログに記録されません。代わりに、MongoDB は |
9 | ベクトルデータとは、同じ型の数値が高密度に圧縮された配列です。 |
128 | カスタム データ |
動作
次のセクションでは、値を別の型に変換する方法について説明します。
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 ])) }]オブジェクトを変換します。 binData
バージョン9.0の新機能。
input フィールドがオブジェクトに解決され、to フィールドが binData である場合、$convert はオブジェクトの生の BSON 表現を返します。to.subtype で別の値を指定しない限り、返される binData 値のサブタイプは 0 になります。
出力はオブジェクトの生のBSONであるため、オブジェクトのフィールドの順序と配列内の要素の順序の両方が、返されるバイトに影響します。
$convert この変換のために format、byteOrder、および base フィールドを検証しますが、これらのフィールドは出力には影響しません。
次の表は、オブジェクトから binData への変換の例を示しています。
例 | 結果 |
|---|---|
| |
| |
| |
| フィールドの順序が異なるため、出力は前の例とは異なります。 |
| |
| 配列の要素の順序が異なるため、出力は前の例と異なります。 |
| |
|
|
| Error: Invalid 'format' argument for $convert: bson
|
| null |
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 内の内容に対応する配列を返します。 string には有効なJSON配列を表す文字が含まれている必要があります。 |
null または欠落 | null を返します。 |
次の表に、string を配列に変換する例をいくつか示します。
例 | 結果 |
|---|---|
| [ 1, 2, 3 ] |
| [ 'a', 'b', 'c' ] |
| [ ] |
| エラー: inputが予想されるタイプの「配列」と一致しません |
| エラー: $convert で onError 値がない場合、int から配列への変換がサポートされていません |
| エラー: inputは有効なJSONを表しません : 予期しないスタンドアロン値 |
| [ { '$oid': '507f1f77bcf86cd799439011' } ] |
| [ 1, 2, 3 ] |
| 'on error!' |
| 'on null!' |
binData を配列に変換する
次の例では、$convert が異なる形式の binData をそれぞれの型の値を含む配列に変換する方法を示しています。
input:
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の新機能。
次の表は、オブジェクトに変換できるinput型を一覧表示したものです。
入力タイプ | 動作 |
|---|---|
文字列 | string 内の内容に対応する document を返します。 string には、有効なJSONオブジェクトを表す文字が含まれている必要があります。 |
null または欠落 | null を返します。 |
次の表に、オブジェクトへの変換の例をいくつか示します。
例 | 結果 |
|---|---|
| { a: 1, b: 2 } |
| { } |
| エラー: inputは予想される型「オブジェクト」と一致しません |
| エラー: inputは有効なJSONを表しません : 予期しないスタンドアロン値 |
| エラー: input は有効な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 |
| { |
ブール値に変換
次の表でブール値に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
|---|---|
配列 | true を返します |
バイナリ データ | true を返します |
ブール値 | 何も起こりません。ブール値を返します。 |
コード | true を返します |
日付 | true を返します |
小数点 | 0 でない場合、`true` を返します。 |
Double | 0 でない場合、`true` を返します。 |
整数 | 0 でない場合、`true` を返します。 |
JavaScript | true を返します |
Long | 0 でない場合、`true` を返します。 |
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 |
整数への変換
次の表で、整数に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
|---|---|
ブール値 |
|
BinData |
|
Double | 切り捨てられた値を返します。 切り捨てられた double 値は、整数値の最小値と最大値の範囲内に収まる必要があります。 切り捨てられた値が最小の整数値より小さい、または最大の整数値より大きい場合、double 値を変換することはできません。 |
小数点 | 切り捨てられた値を返します。 切り捨てられた小数値は、整数の最小値と最大値の範囲内に収まる必要があります。 切り捨てられた値が最小整数値より小さい、または最大整数値より大きい 10 進数値は変換できません。 |
整数 | 何も起こりません。整数値を返します。 |
Long | long 値を整数として返します。 long 値は整数の最小値と最大値の範囲内になければなりません。 最小整数値より小さい、または最大整数値より大きい long 値を変換することはできません。 |
文字列 | 文字列の数値を整数として返します。
|
次の表に、整数への変換の例をいくつか示します。
例 | 結果 |
|---|---|
| 1 |
| 0 |
| 1 |
| 5 |
| エラー |
| 5,000 |
| エラー |
| -2 |
| エラー |
| null |
| 1048576 |
| -1763180545 |
| エラー: 長さが無効であるため、BinData の変換に失敗しました: 7 |
10 進数に変換
以下の表は、10 進数に変換できる入力型の一覧です。
入力タイプ | 動作 |
|---|---|
ブール値 |
|
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 に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
|---|---|
ブール値 |
|
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 |
非正規数
MongoDB 8.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 rangeLong への変換
次の表で、long に変換できる入力型を一覧にしています。
入力タイプ | 動作 |
|---|---|
ブール値 |
|
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 |
|
ブール値 | ブール値を文字列として返します。 |
日付 |
|
小数点 |
|
Double |
|
整数 |
|
Long |
|
Max key |
バージョン8.3の新機能。 |
MinKey |
バージョン8.3の新機能。 |
オブジェクト | オブジェクトを string として返します。 バージョン8.3の新機能。 |
ObjectId |
|
正規表現 |
バージョン8.3の新機能。 |
文字列 | 操作はありません 。string 値を返します。 |
タイムスタンプ |
バージョン8.3の新機能。 |
注意
base を指定し、かつ input が数値型である場合、$convert はその基数の整数値の string 表現を返します。文字列の基本変換は整数値でのみサポートされます。それ以外の場合、$convert は変換エラーを返します。onError を指定しない限り。
次の表に、文字列値への変換の例をいくつか示します。
例 | 結果 |
|---|---|
| "true" |
| "false" |
| "2.5" |
| "2" |
| "1000" |
| "5ab9c3da31c2ab715d421285" |
| "2018-03-27T16:58:51.538Z" |
| 'hn3f' |
| "invalid" |
例
このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。
基本変換の例
16進数文字列は整数を表現するコンパクトな方法であり、多くのシステムが識別子を16進数値として交換しています。次の例では、各映画の数値imdb.idを16進数文字列に変換します。
db.movies.aggregate( [ { $match: { title: { $in: [ "The Godfather", "Toy Story", "Metropolis" ] } } }, { $sort: { title: 1 } }, { $project: { _id: 0, title: 1, imdbId: "$imdb.id", hexId: { $convert: { input: "$imdb.id", to: "string", base: 16 } } } }] )[ { title: 'Metropolis', imdbId: 293416, hexId: '47A28' }, { title: 'The Godfather', imdbId: 68646, hexId: '10C26' }, { title: 'Toy Story', imdbId: 114709, hexId: '1C015' }]16進数文字列を整数に戻すには、その文字列を $convert に base: 16 および to: "int" とともに渡します。
タイプ変換の例
次の集計操作では、ほとんどのドキュメントではdoubleですが、他のドキュメントでは空のstringであるimdb.ratingフィールドをdoubleに変換します。また、一部のドキュメントで欠落しているmetacriticフィールドを整数に変換します。$matchステージでは、各変換結果を示す3つの映画を選択します。
db.movies.aggregate( [ { $match: { title: { $in: [ "The Danish Girl", "The Godfather", "Gertie the Dinosaur" ] } } }, { $project: { _id: 0, title: 1, rating: { $convert: { input: "$imdb.rating", to: "double", onError: "Error", onNull: 0 } }, metacritic: { $convert: { input: "$metacritic", to: "int", onError: "Error", onNull: 0 } } } }, { $sort: { title: 1 } }] )[ { title: 'Gertie the Dinosaur', rating: 7.3, metacritic: 0 }, { title: 'The Danish Girl', rating: 'Error', metacritic: 0 }, { title: 'The Godfather', rating: 9.2, metacritic: 100 }]The Danish Girl の場合、imdb.rating の空の string は double に変換できないため、onError は "Error" を返します。Gertie the Dinosaur と The Danish Girl の場合、metacritic が欠落しているため、onNull は 0 を返します。
詳細
を使用して値を配列に変換する
$toArrayを使用して string をオブジェクトに変換する
$toObjectを使用して値をブール値に変換する
$toBoolを使用して値を整数に変換する
$toIntを使用して値を小数に変換します
$toDecimalを使用して値を double に変換します
$toDoubleを使用して値を long に変換する
$toLongを使用して値を日付に変換する
$toDateを使用して値を ObjectId に変換する
$toObjectIdを使用して値を string に変換する
$toStringを使用して日付 string を日付オブジェクトに変換する
$dateFromStringを使用して日付オブジェクトを string に変換する
$dateToString