Overview
このガイドでは、 MongoDBドキュメントを操作するときに拡張JSONデータ形式を使用する方法を学習できます。
JSON は、オブジェクト、配列、数値、string、ブール値、null の値を表す人間が判読可能なデータ形式です。この形式は、 MongoDB がデータを保存するために使用する形式であるBSONデータ型のサブセットのみをサポートします。拡張JSON形式はより多くのBSONタイプをサポートしており、 BSONの各タイプに直接対応するフィールドタイプ情報を表すために "$" のプレフィックスが付いたキーの予約セットを定義します。
JSON、 BSON、 拡張JSONの詳細については、 JSONとBSONリソースおよび 拡張JSON MongoDB Server のマニュアル エントリを参照してください。
拡張 JSON 形式
MongoDB拡張JSON は、 BSONデータを表す string 形式を提供します。各形式はJSON RFCに準拠し、特定のユースケースを満たしています。
次の表は、各 拡張JSON形式について説明したものです。
名前 | 説明 |
|---|---|
拡張または標準 | A string format that avoids loss of BSON type information during data conversions. This format prioritizes type preservation at the loss of human-readability and
interoperability with older formats. The Ruby driver uses this mode by default. |
緩和 | A string format that describes BSON documents with some type information loss. This format prioritizes human-readability and interoperability at the loss of
certain type information. To specify this mode, pass :relaxed as the mode option. |
Shell | A string format that matches the syntax used in the MongoDB shell. This format prioritizes compatibility with the MongoDB shell, which often uses
JavaScript functions to represent types. To specify this mode, pass :legacy as the mode option. |
注意
Rubyドライバーは、$uuid 拡張JSON型を string からバイナリ サブタイプ 4 の BSON::Binaryオブジェクトに解析します。$uuidフィールド解析の詳細については、拡張JSON仕様の $uuid フィールドを解析するための特別なルール セクションを参照してください。
拡張 JSON の例
次の例は、それぞれの拡張 JSON 形式で表される ObjectId、date、long 数値フィールドを含むドキュメントを示しています。 表示する例の形式に対応するタブをクリックします。
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": { "$numberLong": "1601499609" }}, "numViews": { "$numberLong": "36520312" } }
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": "2020-09-30T18:22:51.648Z" }, "numViews": 36520312 }
{ "_id": ObjectId("573a1391f29313caabcd9637"), "createdAt": ISODate("2020-09-30T18:22:51.648Z"), "numViews": NumberLong("36520312") }
拡張 JSON の読み取り
BSON::ExtJSON.parse メソッドを呼び出すと、拡張JSON string をRuby配列に読み込むことができます。このメソッドは、拡張JSON string を解析し、 のデータを含む配列を返します。
次の例は、parse メソッドを使用して、拡張JSON string をハッシュの配列に読み込む方法を示しています。
require 'bson' ex_json = '''[ {"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": { "$scope": {}, "$code": "function x() { return 1; }" }}, {"bin": { "$type": "80", "$binary": "AQIDBA==" }} ]''' doc = BSON::ExtJSON.parse(ex_json) puts doc.class puts doc
{"foo" => [1, 2]} {"bar" => {"hello" => "world"}} {"code" => #<BSON::CodeWithScope:0x0000000123f398e0 @javascript="function x() { return 1; }", @scope={}>} {"bin" => <BSON::Binary:0x7144 type=user data=0x01020304...>}
拡張 JSON の書込み (write)
拡張JSON string を書き込むには、as_extended_json メソッドを使用します。デフォルトでは 、このメソッドは拡張JSON string を 標準形式で返しますが、mode 引数を渡すことで、緩和形式またはレガシー形式を指定できます。
注意
レガシー バージョン
レガシー形式オプションは、 MongoDB拡張JSON v1形式でBSON型を直列化するようにRubyドライバーに指示します。これは、現在の緩和形式と標準形式よりも前のものです。
詳細については、サーバー マニュアルのMongoDB拡張JSON v1 ページを参照してください。
as_extended_json メソッドは、Array や Hash など、いくつかのコアおよび標準ライブラリ タイプで使用できます。次の例では、ハッシュの配列から、標準形式、緩和形式、レガシー形式の拡張JSON string を作成します。
require 'bson' hash_array = [ { "foo" => [1, 2] }, { "bin" => BSON::Binary.new("\x01\x02\x03\x04", :user) }, { "number" => BSON::Int64.new(42) } ] json_string_canonical = hash_array.as_extended_json json_string_relaxed = hash_array.as_extended_json(mode: :relaxed) json_string_legacy = hash_array.as_extended_json(mode: :legacy) puts "canonical:\t #{json_string_canonical}" puts "relaxed:\t #{json_string_relaxed}" puts "legacy:\t\t #{json_string_legacy}"
canonical: [{"foo":[{"$numberInt":"1"},{"$numberInt":"2"}]},{"bin":{"$binary":{"base64":"AQIDBA==","subType":"80"}}},{"number":{"$numberLong":"42"}}] relaxed: [{"foo":[1,2]},{"bin":{"$binary":{"base64":"AQIDBA==","subType":"80"}}},{"number":42}] legacy: [{"foo":[1,2]},{"bin":{"$binary":"AQIDBA==","$type":"80"}},{"number":42}]
詳細情報
詳細については、次のリソースを参照してください。