如何在 MongoDB 中使用 64 位长自增计数器
How to use 64-bit long auto-increment counters in MongoDB
我正在使用 MongoDB 实现一个记录器数据库。上限集合将包含从网络中的多个来源收集的日志消息。因为我之后想在 _id
上进行 $lte/$gte
查询,所以我需要一个作为单调函数增长的 _id
。
为了实现这一点,我实现了本文中描述的自动递增计数器 http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
我的代码是这样的:
var mongo = require("mongodb");
var Promise = require('es6-promise').Promise;
function connectToDB(mongo, uri) {
return new Promise(function(resolve, reject) {
mongo.MongoClient.connect(uri, function (err, db) {
if(err) reject(err);
else resolve(db);
});
});
}
function getNextSequenceNumber(db, counterName) {
return new Promise(function(resolve, reject) {
db.collection("counters", function (err, collection) {
if (err) reject(err);
else {
var criteria = { _id: counterName };
var sort = {$natural: 1};
var update = { $inc: { seq: 1 } };
var options = {remove: false, new: true, upsert: true};
collection.findAndModify(criteria, sort, update, options, function(err, res) {
if(err) reject(err);
else resolve(res.seq);
});
}
});
});
}
它工作得很好,但我读到默认情况下 MongoDB 中使用的数字字段实际上是浮点数。问题是我的数据库是一个有上限的日志条目集合,它会有很多条目。此外,由于这是一个上限集合,旧条目将被覆盖,但计数器将继续增长。将计数器作为浮点数,我不能保证系统在几年后会继续工作。
我的问题是如何强制 MongoDB 在这种特殊情况下使用 64 位计数器。
请提供一些代码示例。
MongoDB(或更确切地说 BSON)具有 NumberLong
类型,这是一个 64 位有符号整数。
从 Node.js 开始,您可以在 update
语句中使用它来创建该类型的 seq
属性:
var update = { $inc : { seq : mongo.Long(1) } };
这似乎也将现有文档的 seq
属性 转换为 NumberLong
。
我正在使用 MongoDB 实现一个记录器数据库。上限集合将包含从网络中的多个来源收集的日志消息。因为我之后想在 _id
上进行 $lte/$gte
查询,所以我需要一个作为单调函数增长的 _id
。
为了实现这一点,我实现了本文中描述的自动递增计数器 http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
我的代码是这样的:
var mongo = require("mongodb");
var Promise = require('es6-promise').Promise;
function connectToDB(mongo, uri) {
return new Promise(function(resolve, reject) {
mongo.MongoClient.connect(uri, function (err, db) {
if(err) reject(err);
else resolve(db);
});
});
}
function getNextSequenceNumber(db, counterName) {
return new Promise(function(resolve, reject) {
db.collection("counters", function (err, collection) {
if (err) reject(err);
else {
var criteria = { _id: counterName };
var sort = {$natural: 1};
var update = { $inc: { seq: 1 } };
var options = {remove: false, new: true, upsert: true};
collection.findAndModify(criteria, sort, update, options, function(err, res) {
if(err) reject(err);
else resolve(res.seq);
});
}
});
});
}
它工作得很好,但我读到默认情况下 MongoDB 中使用的数字字段实际上是浮点数。问题是我的数据库是一个有上限的日志条目集合,它会有很多条目。此外,由于这是一个上限集合,旧条目将被覆盖,但计数器将继续增长。将计数器作为浮点数,我不能保证系统在几年后会继续工作。 我的问题是如何强制 MongoDB 在这种特殊情况下使用 64 位计数器。
请提供一些代码示例。
MongoDB(或更确切地说 BSON)具有 NumberLong
类型,这是一个 64 位有符号整数。
从 Node.js 开始,您可以在 update
语句中使用它来创建该类型的 seq
属性:
var update = { $inc : { seq : mongo.Long(1) } };
这似乎也将现有文档的 seq
属性 转换为 NumberLong
。