您提出问题的方式非常具有误导性。所有你想知道的是“什么时候加工完成,我可以关闭?”。
答案是,您需要尊重回调,一般情况下只需在每次更新完成后通过结果光标进行移动。
最简单的方法没有其他依赖是使用由驾驶员支载的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我有点怀疑你的代码的一般逻辑,特别是当你阅读它的时候测试的东西的长度是否更大,而不会改变那个长度。但这是关于如何实现“流量控制”,而不是修复代码中的逻辑。
我该如何改进测试逻辑?每次将新项目添加到阵列时,我都想添加该项目,以及如何说明它。看看上面的代码抛出的错误https://github.com/DiegoGallegos4/Mongo/blob/master/error.rtf。我的mongo版本是3.0.5,如果这可以帮助你。 –
@DiegoGallegos真的不知道你真的想在这里做什么,所以也许你应该在另一个问题上充分地问。你的问题基本上是关于“流量控制”,并告知每次更新和所有更新是否完成(尽管你可能已经有更多的重点了)。如果您有其他问题,请[提出新问题](http://stackoverflow.com/questions/ask)。我们只能真正回答所问的问题,并且更清楚地将你的“问题”分开。 –