2015-09-03 126 views
0

由於代碼是相當大的,以張貼在這裏,我附上我的github回購https://github.com/DiegoGallegos4/MongoMongoDB的司機的NodeJS,如何知道什麼時候.update()的完成

我試圖去使用駕駛員的NodeJS更新一些記錄符合標準,但首先我必須找到符合另一條標準的記錄。在更新部分,使用查找操作中找到和過濾的記錄。這是,

文件:weather1.js

MongoClient.connect(some url, function(err,db){ 
    db.collection(collection_name).find({},{},sort criteria).toArray(){ 
      .... find the data and append to an array 
      .... this data inside a for loop 
      db.collection(collection_name).update(data[i], {$set...}, callback) 
    } 
}) 

That's用來解決該問題,與當該結構以關閉連接時,它是當數據陣列的長度等於的數回調更新操作。有關更多詳細信息,請參閱回購。

文件:weather.js

在另一種方法,而不是指定者用於。每迭代上的光標。

我已經在幾個論壇上尋找了解決這個問題的一個星期。

我已閱讀關於連接池但我想知道我的代碼上的概念錯誤是什麼。我希望對此主題有深入的瞭解。

回答

1

您提出問題的方式非常具有誤導性。所有你想知道的是「什麼時候加工完成,我可以關閉?」

答案是,您需要尊重回調,一般情況下只需在每次更新完成後通過結果光標進行移動。

最簡單的方法沒有其他依賴是使用由駕駛員支載的stream interface

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost:27017/data',function(err,db){ 

    if(err) throw err; 

    coll = db.collection('weather'); 
    console.log('connection established') 

    var stream = coll.find().sort([['State',1],['Temperature',-1]]) 

    stream.on('err',function(err) { 
     throw err; 
    }); 

    stream.on('end',function() { 
     db.close(); 
    }); 

    var month_highs = []; 
    var state = ''; 
    var length = 0; 


    stream.on('data',function(doc) { 
     stream.pause();       // pause processing documents 

     if (err) throw err; 

     if (doc) { 
      length = month_highs.length 
      if(state != doc['State']){ 
       month_highs.push(doc['State']); 
       //console.log(doc); 
      } 
      state = doc['State'] 

      if(month_highs.length > length){ 
       coll.update(doc, {$set : {'month_high':true} }, function(err, updated){ 
        if (err) throw err; 
        console.log(updated) 
        stream.resume();    // resume processing documents 
       }); 
      } else { 
       stream.resume(); 
      } 
     } else { 
      stream.resume(); 
     } 
    }); 

}); 

這只是一個代碼的副本,從您的回購,重構使用流。所以所有重要的部分都是「流」這個詞出現的地方,最重要的是它們被稱爲的地方。

簡而言之,「數據」事件由遊標結果中的每個文檔發出。首先您撥打.pause(),以便新文檔不會超出處理範圍。然後你做你的.update(),並在它的回調中返回你呼叫.resume(),流程繼續下一個文檔。

當光標用完時,會發出最終「結束」,那就是您撥打db.close()的地方。

這是基本的流量控制。對於其他方法,請看node async庫作爲一個好幫手。但是不要使用異步控制循環數組,並且不要使用.each(),這是DEPRECATED

您需要在.update()回調完成後發出信號,以便無論如何都要遵循新的「循環迭代」。這是基本沒有額外的依賴性方法。

P.S我有點懷疑你的代碼的一般邏輯,特別是當你閱讀它的時候測試的東西的長度是否更大,而不會改變那個長度。但這是關於如何實現「流量控制」,而不是修復代碼中的邏輯。

+0

我該如何改進測試邏輯?每次將新項目添加到陣列時,我都想添加該項目,以及如何說明它。看看上面的代碼拋出的錯誤https://github.com/DiegoGallegos4/Mongo/blob/master/error.rtf。我的mongo版本是3.0.5,如果這可以幫助你。 –

+0

@DiegoGallegos真的不知道你真的想在這裏做什麼,所以也許你應該在另一個問題上充分地問。你的問題基本上是關於「流量控制」,並告知每次更新和所有更新是否完成(儘管你可能已經有更多的重點了)。如果您有其他問題,請[提出新問題](http://stackoverflow.com/questions/ask)。我們只能真正回答所問的問題,並且更清楚地將你的「問題」分開。 –

相關問題