文字列の長さとnullターミネータの両方の理由は、既存のCスタイルの文字列との互換性とパフォーマンスの2つです。
パフォーマンスのために、MongoDBは、BSON全体を反復処理することなく、ドキュメント内の特定のフィールドにすばやく移動できる必要があります。これは、大きな(たとえば、16 MB)ドキュメントの終わりに近いフィールドを探している場合は特に重要です。文字列型の最初の情報の1つとしてエンコードされた文字列の長さを使用すると、そのバイト数をスキップして次のフィールドに移動できます。それ以外の場合は、文字列の終わりが見つかるまで文字列全体を反復処理する必要があります。
互換性のために、MongoDBはC ++で記述されており、文字列はnullで終了 されます。 。長さがエンコードされているため、そのnullターミネータを切り取って1バイトを節約できますが、その文字列をBSONからC ++で使用できる形式にするには、そのnullを再度タックする必要があります。これには、1バイトを節約することだけが有利な特殊な文字列処理ルーチンが必要になります。
全体として、1バイトを「無駄にする」ことは許容できるトレードオフであると判断されました。