0

MongoDB を使用してロガー データベースを実装しています。上限のあるコレクションには、ネットワーク全体の複数のソースから収集されたログ メッセージが含まれます。後で$lte/$gteクエリを実行したいので、単調関数として成長する が必要です。_id_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 ビット カウンターを使用させるにはどうすればよいかということです。

いくつかのコード例を提供してください。

4

1 に答える 1

2

MongoDB (またはむしろ BSON) にNumberLongは、64 ビット符号付き整数の型があります。

Node.js からupdateステートメントで使用してseq、そのタイプのプロパティを作成できます。

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

seqこれも、既存のドキュメントのプロパティを に変換するようNumberLongです。

于 2015-07-21T17:10:00.937 に答える