gpt4 book ai didi

javascript - Node.js mongodb 多个计划任务

转载 作者:行者123 更新时间:2023-12-02 14:33:45 25 4
gpt4 key购买 nike

我有以下 .js 文件,它是 Node.js 应用程序的一部分,还有 2 个问题。

var User = require('../app/models/user');   
var Agenda = require('agenda');

var mongoConnectionString = "mongodb://localhost/agenda";
var agenda = new Agenda({db: {address: mongoConnectionString}});


agenda.define('handle energy', function(job, done) {
let lastUpdateRun = new Date(Date.now() - 50*1000); // 50 seconds ago for some buffer room


/****** Energy Loss Per Minute ******/
User.update( // Over 85 -> ~ 40 loss / hour
{'local.energy' : { "$gt" : 85}, "local.energyUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": -0.66 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Over Under 80 -> ~ 25 loss / hour
{'local.energy' : { "$gt": 50, "$lte" : 85 }, "local.energyUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": -0.42 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Under 50 -> ~ 15 loss / hour
{'local.energy' : { "$gt": 25, "$lte" : 50}, "local.energyUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": -0.25 }, "local.energyUpdatedAt": new Date() }, // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Under 25 -> ~ 10 loss / hour
{'local.energy' : { "$gt": 10, "$lte" : 25}, "$or" :[{'local.estate.owned.movedIn' : false}, {'local.estate.rented.movedIn' : false}], "local.energyUpdatedAt": {"$lt": lastUpdateRun} }, // query
{"$inc": { "local.energy": -0.167 }, "local.energyUpdatedAt": new Date()} , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);


/******* Energy Gain Per Minute, No Office *******/

User.update( // Set Energy to Ten if over 9.5 and under 10
{'local.energy' : { "$lt": 10, "$gte" : 9.9}, "$or" : [{'local.estate.movedIn' : false}, {'local.estate.rented.movedIn' : false}], "local.energyUpdatedAt": {"$lt": lastUpdateRun} }, // query
{"$set": { "local.energy": 10 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Under 10 -> ~ 5 gain / hour
{'local.energy' : { "$lt": 9.9}, "$or" : [{'local.estate.movedIn' : false}, {'local.estate.rented.movedIn' : false}], "local.energyUpdatedAt": {"$lt": lastUpdateRun} }, // query
{"$inc": { "local.energy": 0.085 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);


/******* Energy Gain Per Minute, With Office *******/

User.update( // Set Energy to 25 if over 24.5 and under 10
{'local.energy' : { "$lt": 10, "$gte" : 24.5}, "$or" : [{'local.estate.movedIn' : true}, {'local.estate.rented.movedIn' : true}], "local.energyUpdatedAt": {"$lt": lastUpdateRun} }, // query
{"$set": { "local.energy": 10 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);
User.update( // Under 25 -> ~ 15 gain / hour
{'local.energy' : { "$lt": 24.5 } , "$or" : [{'local.estate.movedIn' : true}, {'local.estate.rented.movedIn' : true}], "local.energyUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": 0.250 }, "local.energyUpdatedAt": new Date() } , // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);

done()
});


agenda.on('ready', function() {
agenda.every('one minute', 'handle energy');
agenda.start();
});



// Handle Office Rent Expiration Every Hour
//Handle A Few other things at different times

问题#1:有没有更好的方法来处理所有这些更新,我在短时间内进行了相当多的更新,并且一遍又一遍地重复 90% 的代码。另外,从性能 Angular 来看,这是可行的方法还是我犯了一个大错误?

问题#2:如果我需要更多计划任务(每小时 1 个,每 25 分钟一个),我应该为每个任务创建一个 setInterval,因为 iirc javascript 不处理多个 setInterval。那我该怎么处理呢?

附注我仍在学习 Node/js,所以如果这些是愚蠢的问题,请不要恨我。感谢您的耐心等待。

最佳答案

更新很好。如果需要完成,就需要完成。鉴于它们重复运行,只需确保在 local.energy 和您要查询的每个其他字段之间添加一些复合索引即可:

UserSchema.index({"local.energy": 1});
UserSchema.index({"local.energy": 1, "local.estate.owned.movedIn": 1});
UserSchema.index({"local.energy": 1, "local.estate.rented.movedIn": 1});
//etc.

我看到的唯一让我担心的逻辑是您的更新是并行运行的,对重复更新没有限制。假设您有一个文档:

DocA = {
"local.energy": 9.85
}

根据两个“Energy Gain/No Office”查询的执行顺序,您可能会得到不同的结果。

{"local.energy": {$lt: 9.9}} 的更新查询可以将 DocA 增加到 9.935。现在它进入 {"local.energy": {$gte: 9.9, $lt: 10}} 的更新查询,将其设置为 10。我建议向架构(和索引)添加一个 "lastUpdatedAt": Date 字段,并用它限制您的查询:

let lastUpdateRun = new Date(Date.now() - 50*1000); // 50 seconds ago for some buffer room

User.update( // Over 85 -> ~ 40 loss / hour
{'local.energy' : { "$gt" : 85}, "lastUpdatedAt": {"$lt": lastUpdateRun}}, // query
{"$inc": { "local.energy": -0.66 }, "lastUpdatedAt": new Date()}, // update
{"multi": true}, // Options
function(err, result) { // Callback
if(err) {
console.log(err)
}
}
);

这样,您将只更新在最近的时间间隔内未更新的内容。

关于javascript - Node.js mongodb 多个计划任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37618244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com