Как хранить большие числа в MongoDB с помощью Node.js

Я использую MongoDB с собственным драйвером узла, и мне нужно точно хранить числа, которые могут быть больше, чем максимальное число 2147483647. Мне нужно будет иметь возможность увеличивать число, поскольку я отслеживаю использование. Каковы мои варианты?

Я использую Мангуст. Проблема, с которой я сталкиваюсь, заключается в том, что когда я $inc прошлый 2147483647, он преобразует число в двойное. Как я могу заставить Mongoose использовать 64-битное длинное целое NumberLong?

Моя схема выглядит так

var schema = new Schema({
    ...
    usedBandwidth: {type: Number, min: 0, default: 0}
});

А мой $inc выглядит вот так

model.Account.update(
    {_id: this.account},
    {$inc: {usedBandwidth: this.size}},
    function (err, doc) {}
);

person respectTheCode    schedule 23.12.2011    source источник
comment
Я просто добавил дополнительную информацию и код   -  person respectTheCode    schedule 26.12.2011


Ответы (2)


Теперь вы можете сделать это в Mongoose с помощью подключаемого модуля mongoose-long.

require('mongoose-long')(mongoose);
var SchemaTypes = mongoose.Schema.Types;
var schema = new Schema({
    ...
    usedBandwidth: {type: SchemaTypes.Long, min: 0, default: 0}
});
person JohnnyHK    schedule 28.02.2013
comment
Как использовать этот плагин, когда вы используете es6? - person lomse; 22.02.2020

MongoDB имеет собственный 64-битный тип длинного целого числа, обычно называемый NumberLong (по крайней мере, в оболочке/драйвере javascript MongoDB). Если вы используете драйвер node-mongodb-native, я полагаю, что он просто называется Long (хотя я не уверен в этом, кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь). $inc работает должным образом с полями типа NumberLong.

person dcrosta    schedule 23.12.2011
comment
$inc не работает должным образом с Mongoose (примечание: не Mongo, а Mongoose) для дельта-значений, равных или превышающих 2^31. Затем они внезапно превращаются в двойников. - person arik; 04.06.2016