AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

拡張 JSON

JSON は、オブジェクト、配列、数値、string、ブール値、null の値を表すデータ形式です。 拡張 JSON形式では、BSON の各型に直接対応するフィールド型情報を表すために「 $ 」というプレフィックスが付いたキーの予約セットが定義されます。BSON は MongoDB がデータを保存するために使用する形式です。

MongoDB 拡張 JSON は、BSON データを表すためのさまざまな string 形式を機能します。 異なる形式はそれぞれ JSON RFC に準拠し、特定のユースケースを満たしています。 拡張形式は標準形式とも呼ばれますが、情報を失うことなく双方向変換を行うためにすべての BSON 型に特定の表現を備えています。 緩和モード形式は、より簡潔で通常の JSON に近いものですが、数値フィールドの特定のバイトサイズなどのすべての型情報を表すものではありません。

各形式の説明については、次の表を参照してください。

名前
説明

拡張

標準形式とも呼ばれるこの JSON 表示では、BSON 型情報の損失が避けられます。
この形式では、可読性と古い形式との相互運用性を犠牲にして、型の保存が優先されます。

緩和モード

何らかのタイプ情報が失われたBSONドキュメントを記述するJSON表現。
この形式では、特定のタイプ情報を除いて、人間が判読できることと相互運用性を優先します。

Shell

MongoDB shell で使用される構文に一致する JSON 表示。
この形式は、型を表すために JavaScript 関数を使用することが多い MongoDB shell との互換性を優先します。

厳密

非推奨。この表現は、 JSON RFC に完全に準拠したレガシー形式で、任意のJSONパーサーが型情報を読み取れる。

注意

ドライバーは、$uuid拡張JSONタイプを string からバイナリ サブタイプ 4 の BsonBinaryオブジェクトに解析します。$uuidフィールド解析の詳細については、拡張JSON仕様の $uuid フィールドを解析するための特別なルール セクションを参照してください。

JSON、 BSON、 拡張JSONの詳細については、 MongoDB ServerマニュアルのJSONとBSONと 拡張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")
}
{
"_id": { "$oid": "573a1391f29313caabcd9637" },
"createdAt": { "$date": 1601499609 },
"numViews": { "$numberLong": "36520312" }
}

bson.json_util.loads() メソッドを呼び出すと、拡張JSON string をPythonオブジェクトに読み込むことができます。このメソッドは、拡張JSON string を解析し、 データを含むPythonリストを返します。

次の例は、loads() メソッドを使用して、拡張JSON string を辞書のリストに読み込む方法を示しています。

from bson.json_util import loads
ejson_str = '''[
{"foo": [1, 2]},
{"bar": {"hello": "world"}},
{"code": {
"$scope": {},
"$code": "function x() { return 1; }"
}},
{"bin": {
"$type": "80",
"$binary": "AQIDBA=="
}}
]'''
doc = loads(ejson_str)
print(doc)
[
{'foo': [1, 2]},
{'bar': {'hello': 'world'}},
{'code': Code('function x() { return 1; }', {})},
{'bin': Binary(b'\x01\x02\x03\x04', 128)}
]

Python 3 では、ドライバーはサブタイプ 0 のJSONバイナリ値を bytesクラスのインスタンスにデコードします。Python 2 では、ドライバーはこれらの値をサブタイプ 0 を持つ Binaryクラスのインスタンスにデコードします。

次のコード例は、 PyMongo がサブタイプ 0 のJSONバイナリ インスタンスを復号化する方法を示しています。対応するコードを表示するには、Python 2 タブまたは Python 3タブを選択します。

from bson.json_util import loads
doc = loads('{"b": {"$binary': b'this is a byte string'})
print(doc)
{u'b': Binary('this is a byte string', 0)}
from bson.json_util import loads
doc = loads('{"b": {"$binary': b'this is a byte string'})
print(doc)
{'b': b'this is a byte string'}

bson.json_util.dumps() メソッドを呼び出すと、辞書のリストから拡張JSON string を書き込むことができます。次の例では、拡張JSON string を Relaxed形式で出力します。

from bson import Code, Binary
from bson.json_util import dumps
doc = [
{'foo': [1, 2]},
{'bar': {'hello': 'world'}},
{'code': Code('function x() { return 1; }', {})},
{'bin': Binary(b'\x01\x02\x03\x04', 128)}
]
ejson_str = dumps(doc)
print(ejson_str)
'''[
{"foo": [1, 2]},
{"bar": {"hello": "world"}},
{"code": {
"$code": "function x() { return 1; }",
"$scope": {}
}},
{"bin": {
"$binary": {
"base64": "AQIDBA==",
"subType": "80"
}}}
]'''

デフォルトでは 、dumps() メソッドは、 緩和形式で拡張JSON string を返します。別の形式を指定するには、json_options パラメータに次のいずれかの値を渡します。

  • CANONICAL_JSON_OPTIONS: 拡張JSON string を 標準形式で返します。

  • LEGACY_JSON_OPTIONS: レガシー形式の拡張JSON string を返します。代わりに、緩和形式を使用することをお勧めします。

次の例は、拡張JSON を標準形式で出力する方法を示しています。

from bson import Code, Binary
from bson.json_util import dumps, CANONICAL_JSON_OPTIONS
doc = [
{'foo': [1, 2]},
{'bar': {'hello': 'world'}},
{'code': Code('function x() { return 1; }', {})},
{'bin': Binary(b'\x01\x02\x03\x04', 128)}
]
ejson_str = dumps(doc, json_options=CANONICAL_JSON_OPTIONS)
print(ejson_str)
'''[
{"foo": [
{"$numberInt": "1"},
{"$numberInt": "2"}
]},
{"bar": {"hello": "world"}},
{"code": {
"$code": "function x() { return 1; }",
"$scope": {}
}},
{"bin": {
"$binary": {
"base64": "AQIDBA==",
"subType": "80"
}}}
]'''

次のセクションのリソースは、 拡張JSON の操作の詳細を提供します。

bson.json_util のメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。

python-bsonjs は、 libbson 上に構築された別のパッケージで、 BSON を拡張JSONに変換できます。python-bsonjsパッケージはPyMongoに依存しておらず、場合によっては json_util よりもパフォーマンスが向上する可能性があります。

Tip

RawBSONDocument 型の使用

python-bsonjs は、RawBSONDocument 型から変換する場合、 PyMongoで最も動作します。