2015-08-09 190 views
0

如果tmx较新,如果旧的什么都不做,并且如果不存在,插入文档,我的应用应该更新。 如果插入文档,它可以很好地工作,否则它不会正确更新或者说E11000 dup键。 试图找出我的回调是错误还是逻辑。 (我是新的node.js + mongodb)MongoClient = require('mongodb')。MongoClient, assert = require('assert'), url ='mongodb:// localhost:27017/pfc';Node.js Mongodb回调问题

MongoClient.connect(url, function (err, db) { 
     run(db); 
    }); 


    function run(db) { 
     fs.readFile('log.log', 'utf8', function (err, source) { 
      if (err) throw err; 
      var dataFile = JSON.parse(source); 
      dataFile.forEach(function (item) { 
       upsert(db, item, function (err, result) { 
        if (err) console.dir(err); 

       }); 
      }); 
     }) 
    } 

    function upsert(db, doc, callback) { 

    db.collection('flags').findOne({vid: doc.vid}, function (err, item, result) { 

     if (item.vid != null) { 
      if (!(item.tmx instanceof Date)) { 
       item.tmx = new Date(item.tmx) 
      } 
      if(!(doc.tmx instanceof Date)){ 
       doc.tmx = new Date(doc.tmx) 
      } 

      if (item.tmx < doc.tmx) { 
       console.dir("Date validation") 
       db.collection('flags').updateOne({vid: item.vid}, { 
         $set: { 
          "tmx": doc.tmx 
         } 
        },{upsert:true}, function (err, result) { 
         callback(err, result); 

        } 
       ) 

       callback(err, result); 
      } 
      else{ 
       console.dir("older") 
       callback(err, result); 
      } 
     } 
     else { 
      db.collection('flags').insertOne(doc, function(err, result) { 
       callback(err, result); 
      }); 
     } 
    })} 

编辑: 从 'log.log' 文件中的文件有这样的结构:

{ VID:2848 TMX: “2015-07-18T23:56:17.000Z” }

{ VID:2848 TMX:2015-07-19T00:00:17.000Z }

collection.find({VID:doc.vid},函数(例如RR,项目){

如果(项目)//没有发现在收集,项目与VID:2848 插入文档,以收集 否则,如果(项目)//发现VID项目:2848 如果(项目.tmx < doc.tmx)如果doc.tmx是新 更新集合与最近的文档

与@Aaron杜福尔帮助我摆脱回调的问题//只更新,谢谢:) 但现在的问题是当我已经收集已经收集的文档并在log.log中查找最新的文档时,它从最早的文档开始直到最新的文档:(

+1

你UPSERT逻辑是脆弱的竞争条件,这可能会导致问题。你尝试过Mongo的内置upsert吗? –

+0

当我必须比较日期来更新 –

+0

时,无法看到如何使用它,因为如果该项不存在,则获得item.tmx属性为null的错误,所以我需要确认该项存在,以便我可以比较文件中的日期与mongodb的日期 –

回答

1

您的upsert很容易受到竞争条件的影响,并且run会多次并行调用,所以这可能是问题所在。目前尚不清楚doc看起来到底是什么样,所以你可能需要稍微更复杂的逻辑,但这里是一个使用蒙戈的upsert,以使事情更安全的版本:

function upsert(db, doc, callback) { 
    db.collection('flags').update({vid: doc.vid}, {$set: doc}, {upsert: true}, function(err) { 
    db.collection('flags').update({vid: doc.vid, tmx: {$lt: doc.tmx}}, {$set: tmx: doc.tmx}, function(err) { 
     callback(); 
    }); 
    }); 
} 
+0

m8你是一个天才,救了我的命:D –

+0

发现了一个小错误, 例如,最早的记录是从07/08/2015 00:00:17和最新来自今天。 如果我再次运行该应用程序,它将更新为最旧,然后再次尝试新的方式,我尝试的方式不起作用。 :( 如何避免这种情况? –

+1

@TelmoIvo我不明白你遇到的问题,也许编辑它到问题,所以你有更多的空间来解释它? –