Reputation: 43116
I am using MongoDB with the native node driver and need to accurately store numbers that may be larger than the int maximum 2147483647. I will need to be able to increment the number as I am tracking usage. What are my options?
I am using Mongoose. The problem I am having is that when I $inc
past 2147483647 it converts the number to a double. How can I force Mongoose to use the 64-bit long int NumberLong
?
My schema looks like this
var schema = new Schema({
...
usedBandwidth: {type: Number, min: 0, default: 0}
});
And my $inc
looks like this
model.Account.update(
{_id: this.account},
{$inc: {usedBandwidth: this.size}},
function (err, doc) {}
);
Upvotes: 17
Views: 15804
Reputation: 173
If you are sure that your numbers will not be more than [-2^63 to 2^63-1]
you will be fine with Long constructor in mogodb (take a look to this article. But keep this into account, bigint
in javascript can represent numbers of arbitrary precision, more than Mongo 64bits Long type can represent, so take care if you decide to use bigint in your javascript code.
Anyway, if your numbers could be really big you should prefer string type over Long()
constructor in mongodb.
Upvotes: 0
Reputation: 312149
You can now do this in Mongoose with the mongoose-long
plug-in.
require('mongoose-long')(mongoose);
var SchemaTypes = mongoose.Schema.Types;
var schema = new Schema({
...
usedBandwidth: {type: SchemaTypes.Long, min: 0, default: 0}
});
Upvotes: 15
Reputation: 26278
MongoDB has a native 64-bit long integer type, usually called NumberLong
(at least in the MongoDB javascript shell/driver). If you're using the node-mongodb-native driver, I believe it is just called Long
(though I am not certain of this, someone please correct me if I'm wrong). $inc
works as expected against fields of type NumberLong
.
Upvotes: 4