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 ビット カウンターを使用させるにはどうすればよいかということです。
いくつかのコード例を提供してください。