私はMongoDBを使い始めたばかりですが、気付いたのは、BSONを使用してデータを内部に保存していることです。ただし、ドキュメントでは、BSONとは何か、およびBSONがMongoDBでどのように使用されているかについては明確ではありません。誰かが私にそれを説明してもらえますか?
7 に答える
BSONは、MongoDBがドキュメントをコレクションに保存するときに使用するJSONのようなドキュメントのバイナリエンコーディングです。JSONでサポートされていないDateやbinaryなどのデータ型のサポートが追加されます。
実際には、MongoDBを操作するときにBSONについて詳しく知る必要はありません。ドキュメントを作成するときに、言語のネイティブタイプとそのドライバーの提供されたタイプ(ObjectIdなど)を使用するだけで、それらはにマップされます。ドライバーによる適切なBSONタイプ。
BSONとは何ですか?
BSON [bee・sahn]は、Binary JSONの略で、JSONのようなドキュメントのバイナリエンコードされたシリアル化です。
JSONとどう違うのですか?
BSONは宇宙で効率的になるように設計されていますが、場合によってはJSONよりもはるかに効率的ではありません。場合によっては、BSONはJSONよりもさらに多くのスペースを使用します。この理由は、BSONの設計目標のもう1つであるトラバース性です。BSONは、文字列やサブオブジェクトの長さなど、いくつかの「余分な」情報をドキュメントに追加します。これにより、トラバーサルが高速になります。
BSONは、エンコードとデコードが高速になるようにも設計されています。たとえば、整数は32(または64)ビット整数として格納されるため、テキストとの間で解析する必要はありません。これは、小さな整数に対してJSONよりも多くのスペースを使用しますが、解析ははるかに高速です。
コンパクトさに加えて、BSONは、JSONでは使用できない追加のデータ型(特にBinDataおよびDateデータ型)を追加します。
出典: http: //bsonspec.org/
MongoDBはJSONドキュメントをバイナリエンコード形式で表すため、バックグラウンドでBSONと呼びます。
BSONはJSONモデルを拡張して、JSONでサポートされていないDateやbinaryなどの追加のデータ型を提供します。また、さまざまな言語でのエンコードとデコードを効率的に行うために、順序フィールドも提供します。
言い換えれば、 BSONは単なるバイナリJSON (さらにいくつかのデータ型を持つJSONのスーパーセット、最も重要なのはバイナリバイト配列)であると言えます。
JSONのシリアル化形式として使用するMongodbには、ドキュメントを保存およびアクセスするためのエンコード形式が含まれています。簡単に言うと、BSONはJSONデータのバイナリエンコード形式であると言えます。
詳細については、mongoDBの記事:https ://om9x.com/blog/bson-vs-json/
MongoDBは、BSONと呼ばれるバイナリエンコード形式のJSONドキュメントをバックグラウンドで表します。BSONはJSONモデルを拡張して、追加のデータ型を提供し、さまざまな言語内でのエンコードとデコードを効率的に行います。
JSON上でBSONエンコーディングを使用することにより、MongoDBは、生の形式でJSONドキュメント内に存在する値の上にインデックスを作成する機能を取得します。NoSQLシステムはインデックスをサポートしていないことが知られていたため、これは効率的な分析クエリの実行に役立ちます。
この比較的短い記事では、BSONとJSONについてかなり説明しています。JSONの問題のいくつか、BSONが発明された理由、JSONと比較して解決する問題、およびBSONがどのように役立つかについて説明しています。
https://www.compose.com/articles/from-json-to-bson-and-back/
私のユースケースでは、その記事は、JSONへのシリアル化が私にとってはうまくいくだろうと私に教えてくれました、そして私はBSONにシリアル化する必要はありませんでした
OPの質問の範囲内に厳密にとどまるには:
- BSONとは何ですか?
BSONは、スカラー型(int32、int64、decimal、dateなど)の豊富なセットに加えて、バイトストリームに表示される可能性のあるコンテナー(オブジェクト、別名マップ、および配列)の仕様です。BSONの「ネイティブ」文字列形式はありません。それはbyte[]仕様ですか。このバイトストリームを操作するために、バイトストリームをその言語に適した実際のタイプに変換できる多くのネイティブ言語の実装が利用可能です。これらはコーデックと呼ばれます。たとえば、Document
MongoDBからクラスへのBSONコーデックのJava実装は、オブジェクトをを実装するものに変換しますjava.util.Map
。日付はにデコードされjava.util.Date
ます。BSONの送信は、たとえばJavaやPythonでは次のようになります。
Java:
import org.bson.*;
MyObject --> get() from MyObject, set() into org.bson.Document --> org.bson.standardCodec.encode(Document) to byte[]
XMIT byte[]
python:
import bson
byte[] --> bson.decode(byte[]) to dict --> get from dict --> do something
文字列への呼び出しと文字列からの呼び出しは含まれません。パーサーはありません。空白や二重引用符、エスケープ文字については何もありません。 Dates
、、およびJava側BigDecimal
でキャプチャされた配列は、Pythonでは、、、およびの配列として再表示されます。Long
datetime.datetime
Decimal
int
それに比べて、JSONは文字列です。JSONのコーデックはありません。JSONの送信は次のようになります。
MyObject --> convert to JSON (now you have a big string with quotes and braces and commas)
XMIT string
parse string to dict (or possibly a class via a framework)
表面的にはこれは同じように見えますが、スカラーのJSON仕様には、文字列と「数値」のみが含まれています(boolやnullなどは除外されています)。JSONで送信者から受信者にlong
またはを送信する直接的な方法はありません。BigDecimal
どちらも単なる「数」です。さらに、JSONにはプレーンバイト配列の型がありません。すべての非ASCIIデータは、base64であるか、それを保護する方法でエンコードされ、文字列として送信される必要があります。BSONにはバイト配列型があります。プロデューサーが設定し、コンシューマーが取得します。文字列を目的のタイプに戻すための二次処理はありません。
- MongoDBはBSONをどのように使用しますか?
まず、コンテンツのワイヤープロトコルです。これは、ディスク上のデータ形式でもあります。さまざまな長さのタイプ(特に文字列)はBSON仕様の長さ情報を伝達するため、これによりMongoDBはオブジェクトをパフォーマンス的にトラバースできます(フィールド間をホッピング)。コレクション内のオブジェクトを見つけることは、インデックスの使用を含む単なるBSON以上のものです。