Нет, это не правда. Числа с плавающей запятой хранятся с использованием восьми байтов, поэтому независимо от размера числа это всегда будет восемь байтов. Строки имеют переменную длину, поэтому строковое представление числа займет столько байтов, сколько необходимо.
Однако это не означает, что вы можете сэкономить место, используя строки, если строковое представление короче восьми символов. Существует также служебная информация в виде длины строки и нулевого терминатора, то есть пять байтов. "2.1"
требует меньше байтов для представления, чем число 2.1
, но как только вы получите больше пяти символов, строка будет занимать больше места Если вы сохраните свои числа как четырехбайтовые целые числа, ни одно строковое представление не может быть меньше.
Это можно увидеть, введя следующие команды в оболочку mongo
:
> Object.bsonsize({a: 2.1})
16
> Object.bsonsize({a: "2.1"})
16
> Object.bsonsize({a: 2.11})
16
> Object.bsonsize({a: "2.11"})
17
2.1
и "2.1"
имеют одинаковый размер, потому что длина строки составляет три символа, плюс служебные данные в три байта, что соответствует размеру восьмибайтового числа с плавающей запятой (остальные восемь байтов являются служебными для объекта и ключ). Изменение числа на 2.11
не меняет размер, но "2.11"
на один байт больше.
Точные размеры байтов различных типов данных формата BSON можно найти в спецификации: http://bsonspec.org/#/specification