Обоснование как длины строки, так и нулевого терминатора двояко: совместимость с существующими строками в стиле C и производительность.
Для производительности MongoDB должна иметь возможность быстро перейти к определеннойполе в документе без итерации по всему BSON. Это особенно важно, если вы ищете поле, близкое к концу большого (скажем, 16 МБ) документа. С длиной строки, закодированной как одна из первых сведений о типе строки, он может просто пропустить это количество байтов и перейти к следующему полю. В противном случае, он должен будет перебирать всю строку, пока не найдет конец строки.
Для совместимости MongoDB написан на C ++, где строки заканчиваются нулями . Он может обрезать этот нулевой терминатор, чтобы сохранить один байт, поскольку длина закодирована, но для переноса этой строки из BSON в формат, пригодный для использования в C ++, потребовалось бы снова нажать на этот ноль. Для этого потребуется специальная процедура обработки строк, единственным преимуществом которой является сохранение одного байта.
В целом было решено, что «потеря» одного байта является приемлемым компромиссом.