2015-09-03 40 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)。我们只能真正回答所问的问题,并且更清楚地将你的“问题”分开。 –

相关问题