ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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)
- 同 Wave: SQL ダンプ / SQLite / NDJSON / DB ダンプ
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?