ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
概要
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: ドキュメントの終端マーカー
主な型タグ(抜粋)。
| タグ | 型 | 用途 |
|---|---|---|
| 0x01 | double | 64bit 浮動小数 |
| 0x02 | string | UTF-8 文字列(長さプレフィックス + 本体 + \\0) |
| 0x03 | embedded document | BSON 入れ子 |
| 0x04 | array | キーが "0","1","2" の埋め込みドキュメント |
| 0x05 | binData | バイト列 + サブタイプ(UUID 等) |
| 0x07 | ObjectId | 12 バイトの一意 ID(タイムスタンプ + マシン + プロセス + カウンタ) |
| 0x08 | boolean | 0x00 / 0x01 |
| 0x09 | UTC datetime | int64 ミリ秒 |
| 0x10 | int32 | 32bit 整数 |
| 0x12 | int64 | 64bit 整数 |
| 0x13 | decimal128 | IEEE 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 ↔ ネイティブ型を変換
関連形式との比較
| 項目 | BSON | JSON | MessagePack | Protobuf | CBOR |
|---|---|---|---|---|---|
| 形式 | バイナリ | テキスト | バイナリ | バイナリ + スキーマ | バイナリ |
| サイズ | 中〜大 | 大 | 小 | 最小 | 小 |
| 拡張型 | 豊富(ObjectId・Date・Decimal128) | なし | 少(ext type) | スキーマで定義 | 豊富(タグ) |
| スキーマ不要 | ○ | ○ | ○ | × | ○ |
| 代表用途 | MongoDB | 汎用 | Redis・msgpack-rpc | gRPC・大規模配信 | 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 で投げる利点はほぼない
関連リンク
- 親カテゴリ: データベース・データ交換
- 概論: ファイル拡張子とは
- 関連: JSON(.json)
- 関連する形式: SQL ダンプ / SQLite / NDJSON / DB ダンプ
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- 【django】ログイン 認証機能 2026-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- Wi-Fi とは|規格と世代(Wi-Fi 4〜7)・周波数帯・CSMA/CA・WPA3 NEW 2026-09-07 07:45:13
- set コマンドでシェルオプションと位置パラメータを操作 | bash 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- UE5 Get Overlapping Actorsで特定クラスだけ処理|Class Filter・Cast To 2026-09-07 07:45:13
- Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順 2026-09-07 07:45:13
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Linux catコマンドの使い方|行番号表示・複数ファイル連結 2026-09-07 07:45:13
- unable to execute 'gcc': No such file or directory 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?