BSONは、MongoDBで利用されるデータフォーマットになり、MongoDBデータベースのユーザーにとって、マスタしなければいけないものになります。本文では、BSONの基本情報を紹介した上、汎用されているJSONとの比較をも一緒に皆さんに紹介していきたいと思います。
また、Apidogという強力的なAPI管理ツールを利用して、APIとMongoDBの連携を行うことができ、APIテスト中にMongoDBデータベースでCRUD操作を行うこともできるので、非常に便利です。
BSONとは?
BSON (Binary JSON) は、JSON形式のデータをバイナリ形式でエンコードしたデータ形式として、主にMongoDBで使用されている主なデータ格納形式です。BSONはJSON文書の拡張版と考えることができます。データ型として整数、浮動小数点数、文字列、配列、オブジェクト、日付型などをサポートしています。
BSONの主な特徴は以下の通りです。
- JSONとほぼ同じ形式で、キーと値のペアからなるドキュメント型のデータ構造を表現できる
- バイナリデータを直接埋め込むことができる
- JSONよりも効率的にデータを格納できる
- MongDBなどのドキュメント指向のデータベースで主に利用されている
MongoDBなどのドキュメント指向データベースでは、BSON形式でデータを格納しています。JSONよりも効率的にデータを格納でき、インデックス作成も容易です。が、BSONのデータがバイナリ形式になって、人間にとっては読みにくいという側面もあると指摘されています。それでは、次は、BSONデータのメリットとデメリットを包括的に紹介していきたいと思います。
BSONのメリットとデメリット
前述のように、BSONフォーマットを使用するのは、たくさんのメリットがあります:
- JSONに比べて余計なデータがないのでファイルサイズが小さい
- バイナリデータを直接含めることができる
- データ型が豊富で柔軟性が高い
- インデックス付けが容易
- 高速にシリアル化/デシリアル化できる
- MongoDBなどのドキュメント型データベースとの親和性が高い
その一方で、読みにくい、互換性が低いなどのデメリットもあります:
- テキストエディタでは読みにくいバイナリフォーマット
- JSONよりもわずかに処理速度が遅い可能性がある
- 互換性が低く、BSONをサポートしていないツールでは利用できない
- スキーマがないため、データ構造を事前に設計する必要がある
- エコシステムがJSONほど豊富ではない
そこで、用途に応じて、BSONフォーマットのメリットとデメリットを考慮して、BSONかJSONかを選択する必要があります。
BSONのデータ構造
BSONのデータ構造は以下のような特徴があります。
- BSONはJSONに似たキー(フィールド名)と値のペアからなるドキュメント形式です。
- 値のデータ型として、JSONの文字列、数値、真偽値、配列、オブジェクトに加えて、日付、バイナリデータ、正規表現などをサポートしています。
- 各ドキュメントの先頭には文字列の型、文書長、その他のメタデータが格納されています。
- データはキーの辞書順に並べられており、キーはUTF-8の文字列です。
- 値にはそれぞれのデータ型を示すタイプバイトが先頭に付加されています。
- 配列や埋め込みドキュメントも取ることができるネストした構造が可能です。
- BSONの最大ドキュメントサイズは16MBです。
- BSONはJSONよりもコンパクトで、バイナリデータをそのまま含めることができます。
- しかし、人間が直接読み書きすることは困難で、アプリケーションを経由するのが普通です。
このように、BSONはJSONをベースに、データ格納・転送の効率化を図ったバイナリ形式のドキュメント指向データフォーマットです。MongoDBなどで活用されています。
BSONのサンプル:JSONとの比較を示す
それでは、実際のBSONデータはどのようなものですか?次は、実際のBSONデータのサンプルを皆さんに紹介してから、それをJSONデータに変換して、両者の違いを皆さんに解説していきたいと思います。
BSONデータのサンプルは次:
{
_id: ObjectId("639b3cdf69836718acc3a5e5"),
name: 'John Doe',
age: 35,
address: {
street: '123 Main St',
city: 'Anytown',
state: 'CA'
},
hobbies: ['reading', 'hiking', 'swimming'],
phone: {
home: '555-123-4567',
work: '555-987-6543'
},
active: true
}
_idフィールドにObjectIdオブジェクトを設定することで、このドキュメントを一意に識別できるようになりました。
また、BSONデータは、次のような特徴があります:
- BSONはJSONに似ていますが、より豊富なデータ型をサポートしています(日付、バイナリデータなど)。
- フィールド名と値のペアで構成される。
- 値にはプリミティブ型(文字列、数値、ブール値など)を使える。
- 入れ子のドキュメント(オブジェクト)や配列を値として含めることができる。
- BSONはバイナリでエンコードされるため、JSONよりも効率的に格納/取得できる。
- MongoDBなどのドキュメント指向データベースではBSONが主に使用される。
JSONとBSONの違い
上記のサンプルから、JSONとBSONは、様々な側面で違いがあることがわかりました。次は、フォーマット、データ型、データ表現、用途、スキーマ、処理速度及び互換性などの方面から、JSONとBSONの違いを解説していこうと思います。
フォーマット:
- BSONはバイナリ形式、JSONはテキスト形式
データ型:
- BSONは日付、ObjectId、バイナリなどJSONにない型をサポート
- JSONはstring, number, boolean, nullのみ
データ表現:
- BSONは型情報をバイナリで格納するのでJSONよりコンパクト
- ただしJSONの方が人間可読性が高い
用途:
- BSONはMongoDBなどのドキュメントDB向け
- JSONは汎用のデータ交換形式
スキーマ:
- BSONはスキーマレス、JSONはスキーマ定義可能
処理速度:
- BSONの方がやや高速にエンコード/デコードできる
互換性:
- BSONはMongoDBエコシステム限定
- JSONは多くの言語やツールで対応済み
両者の主な違いをまとめてみると、BSONはバイナリ効率性とスキーマレスを重視したドキュメントDB向けの形式で、JSONは汎用性と互換性を重視した汎用のデータ形式だと言えます。そこで、それぞれの用途に応じて使い分ける必要があります。
ApidogでBSONをJSONにマッピング
MongoDBなどのドキュメントDBから取得したBSONデータを他のシステムで利用したり、MongoDBのデータを可視化や解析したりするために、それをJSONデータに変換する必要があります。次は、Apidogというツールを利用して、BSONデータをJSONデータにマッピングする方法を皆さんに紹介します。
Apidogは、非常に強力のAPI管理ツールとして、それを使って、直接にデータベースを操作することもできます。最近のアップデートにより、Apidogのデータベース操作は、MongoDBに対応できるようになります。そこで、Apidogは、直接にMangoDBのBSONデータを操作することができるようになりました。
ApidogはどのようにBSONを操作するか
Apidogのデータベース操作機能を使って、MongoDBデータベースに直接に接続することができるため、Apidogを通じて、MongoDBのデータベースのCRUD操作を行うことができます。Apidogは、BSONで特有のデータ型のデータの内容に従って、適切なJSONのデータ型に1対1で自動マッピングできます。
Apidogを使って人間にとって読みやすいJSONデータを使って、BSONデータを操作できます。そこで、APIテストの中で、対応するデータを直接にMongoDBから取得したり、データベース上のデータを変更したりすることができるようになったので、APIテストをこれまでにないほどスムーズにすることができます。
BSONの_idフィールドのマッピング
特に注意を払う必要があるのは、BSONデータの特有の _id
フィールドです。MongoDBの制約により、すべてのBSONデータにはプライマリーキーとする _id
フィールドが含まれる必要があります。この _id
フィールドのデフォルトのデータ型は、string
の代わりにObjectId
になります。
Apidogは、 ObjectId
タイプの_id
フィールドを通常のstring
型で処理できます。Apidogは、_id
フィールドの値をObjectId
のフォーマットに当てはまるかどうかを自動的に検出できます。その値がObjectId
型に当てはまる場合、それを直接にBSONの_id
フィールドにObjectId
型でマッピングします。

例えば、次のようなBSONデータがあります:
{
_id: ObjectId('65486728456e79993a150f1c'),
name: "Apidog"
}
Apidogでその_id
フィールドにマッピングするには、「クエリ条件」で 次のようなJSONデータを入力することで実現できます。
{
"_id": "65486728456e79993a150f1c"
}
まとめ
本文では、MongoDBで用いられるBSONデータ形式と汎用的なJSON形式の違いについて概観しました。BSONはバイナリ効率性が高い反面、人間可読性ではJSONに劣ります。
Apidogを活用して、MongoDBのBSONデータのCRUD操作を行うことができるので、BSONの効率性とJSONの汎用性を両立でき、MongoDB利用シーンに大きなメリットをもたらします。APIとドキュメントDB連携において、Apidogが重要な役割を果たすと期待されます。