Строка mongodb меньше места, чем float - PullRequest
1 голос
/ 02 июля 2011

правда ли, что в mongodb сохраняемые строки занимают меньше места, чем числа с плавающей запятой?

поэтому, если у меня обновленное поле времени, а не сохранять время как число с плавающей запятой, я должен сохранить его как строку?1003 *

Есть ли причины, по которым я бы не хотел этого делать?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 02 июля 2011

Нет, это не правда. Числа с плавающей запятой хранятся с использованием восьми байтов, поэтому независимо от размера числа это всегда будет восемь байтов. Строки имеют переменную длину, поэтому строковое представление числа займет столько байтов, сколько необходимо.

Однако это не означает, что вы можете сэкономить место, используя строки, если строковое представление короче восьми символов. Существует также служебная информация в виде длины строки и нулевого терминатора, то есть пять байтов. "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

2 голосов
/ 02 июля 2011

Если вы действительно заботитесь о пространстве и сохраняете что-то простое (всего с несколькими десятичными дробями, ограниченным диапазоном), вы можете умножить это на 10, 100, ... и сохранить его как int32.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...