7.

BSON (.bson) とは|MongoDB が使うバイナリ JSON 形式

編集
この記事の要点
  • BSON(Binary JSON)は MongoDB 開発元の MongoDB Inc. が 2009 年に策定したバイナリ形式の JSON。.bson 拡張子
  • JSON を効率よくシリアライズしつつ、JSON にない型(ObjectIdDateDecimal128BinaryTimestamp 等)を扱える
  • 各ドキュメントは 先頭 4 バイトに長さ を持つ「length-prefixed」構造。スキップ・並列読みが容易
  • 主用途は MongoDB の内部ストレージ形式・wire protocol。mongodump の出力ファイルも BSON
  • bsondump コマンドで JSON に変換でき、mongorestore で書き戻せる
  • JSON より読み書きが速いが、サイズは JSON より大きくなることも多い(型タグや長さフィールドのオーバーヘッド)
  • 一般的な API のペイロード形式としてはほぼ使われない。MongoDB エコシステム以外で見ることは稀

概要

BSON(Binary JSON、読み: ビーソン)は、MongoDB Inc.(当時は 10gen)が 2009 年に策定したバイナリ形式のドキュメント表現です。MongoDB の 内部ストレージ形式wire protocolダンプファイルmongodump 出力)の中核で、ファイル拡張子は .bson を使います。仕様は bsonspec.org で公開されており、各言語向けに公式ドライバが用意されています。

狙いは「JSON のセマンティクスを保ちつつ、機械処理で速く、JSON にない型も扱えるようにする」こと。JSON テキストはパースに文字列処理が必要で、数値表現や日付の扱いに揺れがあります。BSON はバイナリで型タグを直接持つため、パースが速く・型が正確。ObjectId(12 バイトの一意 ID)、Date(64bit 整数の UTC ミリ秒)、Decimal128(金融計算向け 10 進浮動小数)、Binary(バイト列 + サブタイプ)など、MongoDB が必要とする型を ネイティブに表現 できます。

その一方、JSON 配列やオブジェクトの境界に長さフィールドを持つため、必ずしも JSON より小さくならない という特徴があります。短い文字列ばかりだと BSON のほうが大きいこともあり、サイズ最適化が目的なら MessagePack・Protobuf・CBOR のほうが適しています。BSON の利点は「速さ」「型」「MongoDB との親和性」であり、汎用の通信フォーマットとして使うことは稀です。

内部構造(バイナリレイアウト)

1 つの BSON ドキュメントは次のような並びです。

+---------+------------------------+------+
|  int32  |  element*               | 0x00 |
| (length)|  (type + name + value) | (end)|
+---------+------------------------+------+
  • length: ドキュメント全体のバイト数(自分自身を含む int32 リトルエンディアン)。これにより読み手は ドキュメントを丸ごとスキップ できる
  • element: 「1 バイトの型タグ + null 終端の C 文字列フィールド名 + 値」を 0 個以上並べる
  • 0x00: ドキュメントの終端マーカー

主な型タグ(抜粋)。

タグ用途
0x01double64bit 浮動小数
0x02stringUTF-8 文字列(長さプレフィックス + 本体 + \\0)
0x03embedded documentBSON 入れ子
0x04arrayキーが "0","1","2" の埋め込みドキュメント
0x05binDataバイト列 + サブタイプ(UUID 等)
0x07ObjectId12 バイトの一意 ID(タイムスタンプ + マシン + プロセス + カウンタ)
0x08boolean0x00 / 0x01
0x09UTC datetimeint64 ミリ秒
0x10int3232bit 整数
0x12int6464bit 整数
0x13decimal128IEEE 754 10 進 128bit

JSON 風に書くと { "name": "alice", "age": 30 } という単純なドキュメントが、BSON では 0x18 0x00 0x00 0x00 0x02 name\\0 0x06 0x00 0x00 0x00 alice\\0 0x10 age\\0 0x1E 0x00 0x00 0x00 0x00 のような並びになります(手書き例)。

主な用途

  • MongoDB の内部ストレージ: WiredTiger ストレージエンジンが BSON 単位でドキュメントを管理
  • MongoDB wire protocol: クライアントとサーバ間の通信がすべて BSON
  • mongodump / mongorestore: バックアップは collection.bson + collection.metadata.json の 2 ファイル構成。BSON 側に全ドキュメントが連結されている
  • Change Streams のイベント: MongoDB の変更ストリームも BSON で配信される
  • 言語ドライバの DTO: PyMongo の bson.SON、Node.js の bson パッケージなど、ドライバ層で BSON ↔ ネイティブ型を変換

関連形式との比較

項目BSONJSONMessagePackProtobufCBOR
形式バイナリテキストバイナリバイナリ + スキーマバイナリ
サイズ中〜大最小
拡張型豊富(ObjectId・Date・Decimal128)なし少(ext type)スキーマで定義豊富(タグ)
スキーマ不要×
代表用途MongoDB汎用Redis・msgpack-rpcgRPC・大規模配信IoT・COSE

BSON が他に勝るのは 「JSON と意味互換 + 豊富な型 + 高速パース」 の組み合わせです。逆に純粋な圧縮率や汎用性では他のバイナリ JSON 系(MessagePack / CBOR)に譲る場面が多いです。

コマンド・ツール

# MongoDB のダンプ(collection.bson と metadata.json が dump/ に出力)
mongodump --db=shop --out=dump/

# BSON をテキスト JSON で表示
bsondump dump/shop/users.bson | head

# BSON をリストア
mongorestore --db=shop_new dump/shop/

# Python から BSON を生成
python -c "
from bson import BSON
data = {'id': 1, 'name': 'alice', 'tags': ['admin', 'ops']}
with open('out.bson', 'wb') as f:
    f.write(BSON.encode(data))
"

言語ドライバは Python の pymongo / bson、Node.js の bson、Go の go.mongodb.org/mongo-driver/bson、Java の org.mongodb:bson など。bsondump は MongoDB 公式 Database Tools に同梱されています。

注意点

  • 「BSON は JSON より速くて小さい」は半分しか正しい: 速いのは事実だが、サイズは型タグや長さフィールドのオーバーヘッドで JSON より大きくなるケースがある。短文字列が多いデータほどその傾向
  • ObjectId と UUID は別物: ObjectId は 12 バイト、UUID は 16 バイト。互換性はない。MongoDB 以外で ObjectId をそのまま採用するメリットは薄い
  • Decimal128 のサポート: 金融計算で必要な完全 10 進数。ドライバや言語によっては str 経由でしか扱えない場合がある。JS では BSON.Decimal128.fromString("3.14")
  • JSON ↔ BSON で型が失われる: bsondump--type=json は型情報を落とす。Extended JSON({ "$oid": "..." })形式を使えば往復可能
  • 大きすぎるドキュメント: BSON ドキュメント単体は 16 MB が MongoDB の上限。これを超えるデータは GridFS で分割するしかない
  • 汎用 API には不向き: MongoDB エコシステム外では取り扱えるツールが少なく、ログやイベントを BSON で投げる利点はほぼない

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SQL ダンプ(.sql)
  2. SQLite(.sqlite / .sqlite3 / .db)
  3. Parquet(.parquet)
  4. Avro(.avro)
  5. ORC(.orc)
  6. NDJSON / JSONL(.ndjson / .jsonl)
  7. BSON(.bson)
  8. Protocol Buffers(.proto)
  9. Feather / Arrow IPC(.feather / .ipc / .arrow)
  10. DB ダンプ(.dump / .bak)

最近更新/作成されたページ