BSONはBinary JSONの略で、その名の通りJSONをバイナリで表現したものです。
xSONのなかではJSONに次ぐ知名度を持っており、MongoDBで使われていることで有名です。
JSONがテキスト形式なのに対してBSONバイナリ形式のため、JSONと比較してコンパクトで高速な一方で人間にとっての可読性は低いです。
基本的にはJSONをバイナリ形式にしただけですが、以下のような違いがあります。
データ型
BSONはJSONには存在しない以下のデータ型があります。
- 日付
- 正規表現
また数値型についてもBSONは少々異なります。バイナリで表現されるために数値型が厳格になっています
- 32bit整数
- 64bit整数
- IEEE 754形式の64bit 浮動小数点数
- decimal128形式の10進数浮動小数点数
データサイズを表すヘッダー
JSONで {"hello": "world"}
というデータはBSONでは以下のようになります。
データの先頭に全体のサイズを表すヘッダーがあることが分かります。
また、文字列 world
の先頭にもフィールドサイズを表すヘッダーがあることが分かります。(文字列の終端であるnullを含むためにサイズは6です)
\x16\x00\x00\x00 // total document size
\x02 // 0x02 = type String
hello\x00 // field name
\x06\x00\x00\x00world\x00 // field value (size of value, value, null terminator)
\x00 // 0x00 = type EOO ('end of object')
出展:
この様にデータサイズを表す4バイトのヘッダーがあるため、効率良くフィールドをスキップすることができます。
また、一般的にはJSONよりもBSONの方がサイズが小さくなる傾向にはありますが、ヘッダーの影響で小さいオブジェクトはBSONにするとかえってサイズが大きくなってしまうこともあります。