重要
曖昧さ回避
次のページでは、MongoDB 拡張 JSON v 1 (レガシー拡張 JSON)について説明します。 MongoDB 拡張 JSON v 2の詳細については、「 MongoDB 拡張 JSON(v 2 ) 」を参照してください。
mongoでサポートされているデータ型については、「 mongosh データ型 」を参照してください。
JSONは、 BSONでサポートされている型のサブセットのみを表すことができます。 型情報を保持するために、MongoDB は JSON 形式に次の拡張機能を追加します。
厳密モード。BSON types の厳密なモード表現はJSON RFC に準拠します。すべてのJSONパーサーは、これらの厳密モード表現をキーと値のペアとして解析できます。ただし、 MongoDB内部のJSONパーサーのみが形式で伝達される型情報を認識します。
mongoshell モード。 MongoDB 内部 JSON パーサーとmongoshell はこのモードを解析できます。
さまざまなデータ型に使用される表現は、JSON が解析されるコンテキストによって異なります。
MongoDB Extended JSON v 1と MongoDB ドライバー
次のドライバーは、拡張JSON v1.0 をサポートしています(レガシー):
C#
Ruby
注意
.NET/C# ドライバー 3.0 以降は、厳密モードのサポートはありませんが、shell モードはサポートされています。
その他のドライバーについては、「 MongoDB 拡張 JSON(v 2 ) 」を参照してください。
パーサーとサポートされている形式
厳密モードでの入力
次の例では、型情報を認識して厳密モードで表現を解析できます。
mongoimportバージョン4.0以前--queryさまざまな MongoDB ツールのオプション
mongo shell を含む他の JSON パーサーは、厳密なモード表現をキーと値のペアとして解析できますが、型情報は認識されません。
mongo shell モードでの入力
次の例では、型情報を認識してmongo shell モードで表現を解析できます。
mongoimportバージョン4.0以前--queryさまざまな MongoDB ツールのオプションmongoShell
厳密モードでの出力
Before version 4.2, mongoexport outputs data in strict mode of MongoDB Extended JSON v1.
mongo shell モードでの出力
Before version 4.2, bsondump outputs in mongo shell mode.
BSON データ型と関連表現
以下は、厳密モードと mongo シェルモードでのBSONデータ型と関連する表現を示しています。
バイナリ
data_binary- 厳密モード
mongoshellモード{ "$binary": "<bindata>", "$type": "<t>" } BinData ( <t>, <bindata> )
ここで、値は次のとおりです。
<bindata>は、 バイナリ string の基本64表現です。<t>は、データ型を示す 1 バイトの表現です。Strictモードでは16進数文字列で、 シェルモードでは整数です。拡張BSONドキュメント を参照してください。 http://bsonspec.org/spec.html
日付
data_date- 厳密モード
mongoshellモード{ "$date": "<date>" } new Date ( <date> ) 厳密モードでは、
<date>は、テンプレートYYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>に続く必須のタイムゾーン フィールドを持つ ISO- 8601日付形式です。shellモードでは、
<date>は、エポック UTC からのミリ秒数を提供する 64 ビット符号付き整数のJSON表現です。
タイムスタンプ
data_timestamp- 厳密モード
mongoshellモード{ "$timestamp": { "t": <t>, "i": <i> } } Timestamp( <t>, <i> )
ここで、値は次のとおりです。
<t>は、 UNIXエポックからの秒数 の32ビット符号なし整数の JSON 表現です。<i>は、増分を表す32ビットの符号なし整数であり、
正規表現
data_regex- 厳密モード
mongoshellモード{ "$regex": "<sRegex>", "$options": "<sOptions>" } /<jRegex>/<jOptions>
ここで、値は次のとおりです。
<sRegex>は、有効な JSON 文字の string です。<jRegex>は、有効な stringJSONとエスケープされていないdouble 引用符( )文字を含むことができますが、エスケープされていないスラッシュ("/)文字を含めることはできません。<sOptions>は、アルファベットの文字で表される正規表現オプションを含む string です。<jOptions>は、「g」、「i」、「m」、「s」の文字のみを含む string です(v1.9 で追加)。JavaScriptとmongo Shell表現は限られた範囲のオプションをサポートするため、この表現に変換するときに一致しないオプションはすべて削除されます。
OID
data_oid- 厳密モード
mongoshellモード{ "$oid": "<id>" } ObjectId( "<id>" )
ここで、値は次のとおりです。
<id>は、 24文字の 16 進 string です。
DB 参照
data_ref- 厳密モード
mongoshellモード{ "$ref": "<name>", "$id": "<id>" } DBRef("<name>", "<id>")
ここで、値は次のとおりです。
<name>は、有効な JSON 文字の string です。<id>は、任意の有効な拡張 JSON タイプです。
Undefined 型
data_undefined- 厳密モード
mongoshellモード{ "$undefined": true } undefined JavaScript/BSON 未定義の型の表現。
クエリ ドキュメントでは
undefinedは使用できません。 レガシーのmongoshell を使用してpeopleコレクションに挿入された次のドキュメントを検討します。db.people.insertOne( { name : "Sally", age : undefined } ) 次のクエリは、 エラーを返します。
db.people.find( { age : undefined } ) db.people.find( { age : { $gte : undefined } } ) ただし、次のように
$typeを使用して未定義の値をクエリできます。db.people.find( { age : { $type : 6 } } ) このクエリは、
ageフィールドの値がundefinedであるすべてのドキュメントを返します。重要
The undefined BSON type is deprecated.
mongoshstores a null value instead.For example, use the same code to insert a document in
mongoshand in the legacymongoshell:db.people.insertOne( { name : "Sally", age : undefined } ) 結果として得られるドキュメントは異なります。
{ "name" : "Sally", "age" : null } { "name" : "Sally", "age" : undefined }
MinKey
Max key
NumberLong
data_numberlong- 厳密モード
mongoshellモード{ "$numberLong": "<number>" } Long( "<number>" ) NumberLongは、64 ビットの符号付き整数です。 レガシーのmongoshell では、NumberLongを挿入するには引用符を使用する必要があります。そうしないと、操作でエラーが発生します。9223372036854775807NumberLongたとえば、次のコマンドは、整数値の前後に引用符を付けずに、 を として挿入しようとします。db.json.insertOne( { longQuoted : Long("9223372036854775807") } ) db.json.insertOne( { longUnQuoted : Long(9223372036854775807) } ) The highlighted line produces an error in the legacy
mongoshell. The insert succeeds inmongosh.
NumberDecimal
data_numberdecimal- 厳密モード
mongoshellモード{ "$numberDecimal": "<number>" } Decimal128( "<number>" ) NumberDecimalは、高精度の 10 進数 です。引用符を含める必要があります。そうしないと、入力数値が double として扱われるため、データが失われます。123.40NumberDecimalたとえば、次のコマンドは、値の前後に引用符を付けずに として挿入します。db.json.insertOne( { decimalQuoted : Decimal128("123.40") } ) db.json.insertOne( { decimalUnQuoted : Decimal128(123.40) } ) ドキュメントを取得すると、
decimalUnQuotedの値は変更されていますが、decimalQuotedは指定された精度を保持します。db.json.find() { "_id" : ObjectId("596f88b7b613bb04f80a1ea9"), "decimalQuoted" : Decimal128("123.40") } { "_id" : ObjectId("596f88c9b613bb04f80a1eaa"), "decimalUnQuoted" : Decimal128("123.400000000000") } 重要
This insert behavior is different in
mongosh.引用符で囲まれていない文字列形式、
Decimal128(123.40)は非推奨です。 挿入は成功しますが、警告も生成されます。引用符で囲まれた文字列形式、
Decimal128.fromStringWithRounding("123.40")は値を123.4として保存します。 後続の0は削除されます。