Docs Menu

BSON

このガイドでは、 BSONドキュメントの作成方法、ファイルからのBSONの読み取り方法、 PyMongo を使用したファイルへのBSONの書き込み方法を学習できます。

BSON (Binary JSON )は、 MongoDB がデータを整理して保存するために使用するデータ形式です。このデータ形式には、すべてのJSONデータ構造タイプが含まれ、日付、異なるサイズの整数、ObjectId、バイナリ データなどのタイプのサポートが追加されています。 BSONパッケージを含めることで、 PythonアプリケーションでBSONドキュメントを使用できます。サポートされているタイプの完全なリストについては、 BSON typesサーバーのマニュアル ページを参照してください。

BSONドキュメントは バイナリ形式のMongoDBコレクションに保存されますが、 PyMongo はBSONドキュメントをPython辞書として表します。 PyMongo は、コレクションに挿入するときにPython辞書をBSONドキュメントに自動的に変換します。同様に、コレクションからドキュメントを取得する と、 PyMongo はBSONドキュメントをPython辞書に変換します。

次の例では、辞書とBSON形式の両方のドキュメントを示しています。対応する形式を確認するには、Dictionary タブまたは BSONタブを使用します。

{"hello": "world"}
\x16\x00\x00\x00 # total document size
\x02 # 0x02 = type String
hello\x00 # field name
\x06\x00\x00\x00world\x00 # field value
\x00 # 0x00 = type EOO ("end of object")

このガイドのコード サンプルでは、次の BSON ドキュメントを例として使用します。

{
"address" : {
"street" : "Pizza St",
"zipcode" : "10003"
},
"coord" : [-73.982419, 41.579505]
"cuisine" : "Pizza",
"name" : "Mongo's Pizza"
}

Pythonで辞書を作成するのと同じ表記を使用して、 BSONドキュメントを作成できます。次の例では、前述のサンプルBSONドキュメントを表すBSONドキュメントを作成します。

document = {
"address": {
"street": "Pizza St",
"zipcode": "10003"
},
"coord": [-73.982419, 41.579505],
"cuisine": "Pizza",
"name": "Mongo's Pizza"
}

BSONドキュメントの内容は、 Pythonで辞書を変更するのと同じ表記を使用して変更できます。次の例では、サンプルBSONドキュメントに 3 つの変更を加えます。

  1. 12345 を持つ新しいフィールド restaurant_id を追加します。

  2. cuisineフィールドを削除します。

  3. name フィールドの値を "Mongo's Pizza Place" に設定します。

document["restaurant_id"] = 12345
del document["cuisine"]
document["name"] = "Mongo's Pizza Place"

BSONデータをファイルに書き込むには、出力ファイルでファイルストリームを書き込みバイナリモードで開きます。 次に、各ドキュメントを出力ファイルに書き込みます。 bson.encode() メソッドを使用して、ドキュメントがBSON形式でエンコードされていることを確認します。

次の例では、サンプルBSONドキュメントをfile.bson に書き込みます。

with open("file.bson", "w") as file:
file.write(bson.encode(document))

ファイルからBSONドキュメントを読み取るには、入力ファイルに対して読み取りバイナリモードでファイルストリームを開きます。 次に、bson.decode() メソッドを使用して、読み取るときにBSON形式からドキュメントをデコードします。

次の例では、 file.bson からサンプルBSONドキュメントを読み取ります。

with open("file.bson", "rb") as file:
data = file.read()
document = bson.decode(data)
print(document)
{"address": {"street": "Pizza St", "zipcode": "10003"}, "coord": [-73.982419, 41.579505], "cuisine": "Pizza", "name": "Mongo's Pizza"}

PyMongo は未加工のBSONドキュメントの使用をサポートしています。次のリストには、未加工のBSONドキュメントを使用する必要がある状況がいくつか含まれています。

  • データベースまたはコレクション間でのドキュメントの移動

  • ディスクへのバイナリ データの書き込み

  • Python 辞書への変換やPython辞書からの変換のパフォーマンス オーバーヘッドをバイパス

RawBSONDocumentクラスは、基礎となる未加工BSONバイトへのアクセスを提供するBSONドキュメントの表現です。RawBSONDocument オブジェクトを使用してコレクション内のドキュメントを表すには、MongoClient コンストラクターの document_class パラメータを RawBSONDocument に設定します。

注意

RawBSONDocument オブジェクトは読み取り専用です。RawBSONDocument を変更するには、まずPython辞書に変換する必要があります。

次の例では、RawBSONDocument オブジェクトを使用してコレクションをモデル化するように MongoClientオブジェクトを構成し、前の例からサンプルドキュメントを検索します。

from bson.raw_bson import RawBSONDocument
client = pymongo.MongoClient("<connection URI>", document_class=RawBSONDocument)
collection = client.sample_restaurants.restaurants
raw_doc = collection.find_one({"name": "Mongo's Pizza"})
print(type(raw_doc))
<class 'bson.raw_bson.RawBSONDocument'>

このガイドで説明したメソッドやタイプの詳細については、 BSON APIドキュメント を参照してください。