如何在MongoDB中使用64位长自动增量计数器



我正在使用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中使用的数字字段实际上是浮点数。问题是,我的数据库是一个日志条目的上限集合,它将有很多条目。此外,由于这是一个有上限的集合,旧的条目将被覆盖,但计数器将继续增长。把counter作为一个浮动,我不能保证这个系统在几年后还能继续工作。我的问题是如何在这种特殊情况下强制MongoDB使用64位计数器。

请提供一些代码示例

MongoDB(或者更确切地说是BSON)具有NumberLong类型,这是一个64位有符号整数。

从Node.js你可以使用它在你的update语句创建seq属性的类型:

var update =  { $inc : { seq : mongo.Long(1) } };

这似乎也将现有文档的seq属性转换为NumberLong

最新更新