Подтвердить что ты не робот

Различия MongoDB между NumberLong и простым Integer?

Каковы основные различия (размер, скорость и т.д.) между двойными данными, NumberLong, NumberInt или простым Integer в MongoDB?

Если я хочу сохранить небольшое фиксированное число (что-то между 0 и 1000), какой тип данных я должен использовать?

4b9b3361

Ответ 1

NumberInt

По умолчанию оболочка mongo обрабатывает все числа как значения с плавающей запятой. Оболочка mongo предоставляет конструктору NumberInt() для явного указания 32-битных целых чисел.

NumberLong

По умолчанию оболочка mongo обрабатывает все числа как значения с плавающей запятой. Оболочка mongo предоставляет класс NumberLong() для обработки 64-битных целых чисел.

Конструктор NumberLong() принимает длину как строку:

NumberLong("2090845886852")

Источник: http://docs.mongodb.org/manual/core/shell-types/

Ответ 2

NumberLong и NumberInt не являются типами данных в MongoDB, а функциями JavaScript в оболочке MongoDB.

Типы данных в MongoDB определены в спецификации BSON: http://bsonspec.org/spec.html

Числа хранятся как тип 0x01 (с плавающей запятой), тип 0x10 (32-разрядное целое число) или тип 0x12 (64-разрядное целое число).

Если вы вставляете или обновляете документ в оболочке MongoDB, то NumberLong создает 64-разрядное целое число, NumberInt создает 32-разрядное целое число, а обычный номер JavaScript создает значение с плавающей запятой. Это связано с тем, что в JavaScript нет целых чисел, только числа с плавающей запятой.

Вывод в оболочке MongoDB отображает числа с плавающей запятой и 32-битные целые числа в виде номеров JavaScript, тогда как 64-разрядные целые числа отображаются как вызовы NumberLong:

> db.inttest.insert({f: 1234, i: NumberInt("1234"), l: NumberLong("1234")})
> db.inttest.findOne()
{
        "_id" : ObjectId("5396fc0db8e0b3e2dedb59b0"),
        "f" : 1234,
        "i" : 1234,
        "l" : NumberLong(1234)
}

Различные драйверы MongoDB предоставляют различные способы вставки разных типов чисел. Например, драйвер С++ создает 64-разрядное целое число, если вы добавляете значение "long long" в BSONObjectBuilder.

Запросы совпадают, когда числа равны. В приведенном выше примере запросы

> db.inttest.find({i:1234})
> db.inttest.find({l:1234})
> db.inttest.find({f:1234})
> db.inttest.find({i:NumberLong("1234")})
> db.inttest.find({l:NumberLong("1234")})
> db.inttest.find({f:NumberLong("1234")})

все совпадают с вставленным документом.