使用时间比较将数据插入mongodb

时间:2018-01-18 09:29:50

标签: node.js mongodb

假设我在3个不同的服务器上运行此代码,并且每个服务器都使用单个数据库。

setInterval(function(){
  if(userArray) {
    var report = mongoose.connection.db.collection('report');
    report.insert({datenow:new Date(),userlist:userArray},function(err,doc) {
      if(err) throw err;
    });
  }
},600000);

因此,这段代码在每台服务器上每隔 10分钟运行,但我只希望其中一条将数据插入数据库。由于数据相同,因此插入 3次

如何检查数据是否已由任何一台服务器插入数据库。

我尝试制作一个递增的count变量并将其插入数据库并将其用作唯一的 ID 来检查它是否存在于数据库中。如果它存在,那么我不会插入数据。但是,如果由于某种原因我必须重新启动服务器,那么count将被重置为其初始值,这似乎不是一个可行的解决方案。

那么,我该如何解决这个问题呢?我猜我必须以某种方式比较时间?

2 个答案:

答案 0 :(得分:1)

IMO,当您在数据库中执行插入时,应使用 Cron表达式而不是间隔将执行时间用作报告的主键

<强>解释

Cron表达式可以保证脚本的执行将在准确的时间发生。如果您使用此Cron表达式:00 */10 * * * *(每10分钟一次),您的脚本将完全按11:00:0011:10:0011:20:00执行,依此类推...对于每个服务器您有

因此,您可以将此执行时间用作报告的关键字,这样可以防止多次插入同一报告。

<强>利布斯

您可以使用此lib将Cron与Node.js一起使用:node-cron

示例

var CronJob = require('cron').CronJob;
new CronJob('* * * * * *', function() {
  console.log('You will see this message every second');
}, null, true, 'America/Los_Angeles');

我希望这会对你有所帮助。

答案 1 :(得分:0)

所以我不得不最后比较时间戳并检查它在过去10分钟内插入的内容。这是我提出的解决方案。

setInterval(function(){
    var currDate = new Date().getTime();
    if(keyPairNameArray) {

        var overallreport = mongoose.connection.db.collection('overallreport');
        overallreport.find({}).sort({_id:-1}).limit(1).toArray(function(err, res){
            if(res.length > 0){
                var dbDate = new Date(res[0].datenow).getTime();
                var diffDate = currDate - dbDate;
                if(diffDate < 600000){

                } else {
                    overallreport.insert({datenow:new Date(),userlist:keyPairNameArray},function(err,doc) {
                        if(err) throw err;
                    });
                }
            } else {
                overallreport.insert({datenow:new Date(),userlist:keyPairNameArray},function(err,doc) {
                    if(err) throw err;
            });
            }
        });

    }
},610000);