BSON
項目一覧
Overview
このガイドでは、 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" }
BSON ドキュメントの作成
Pythonで辞書を作成するのと同じ表記を使用して、 BSONドキュメントを作成できます。次の例では、前述のサンプルBSONドキュメントを表すBSONドキュメントを作成します。
document = { "address": { "street": "Pizza St", "zipcode": "10003" }, "coord": [-73.982419, 41.579505], "cuisine": "Pizza", "name": "Mongo's Pizza" }
BSON ドキュメントの変更
BSONドキュメントの内容は、 Pythonで辞書を変更するのと同じ表記を使用して変更できます。次の例では、サンプルBSONドキュメントに 3 つの変更を加えます。
値
12345
を持つ新しいフィールドrestaurant_id
を追加します。cuisine
フィールドを削除します。name
フィールドの値を"Mongo's Pizza Place"
に設定します。
document["restaurant_id"] = 12345 del document["cuisine"] document["name"] = "Mongo's Pizza Place"
BSON をファイルに書き込む
BSONデータをファイルに書き込むには、出力ファイルでファイルストリームを書き込みバイナリモードで開きます。 次に、各ドキュメントを出力ファイルに書き込みます。 bson.encode()
メソッドを使用して、ドキュメントがBSON形式でエンコードされていることを確認します。
次の例では、サンプルBSONドキュメントをfile.bson
に書き込みます。
with open("file.bson", "w") as file: file.write(bson.encode(document))
ファイルからの BSON を読み込む
ファイルから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"}
未加工のBSONデータとの連携
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'>
API ドキュメント
このガイドで説明したメソッドやタイプの詳細については、 BSON APIドキュメント を参照してください。