2015-08-09 206 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我不明白你遇到的問題,也許編輯它到問題,所以你有更多的空間來解釋它? –