由于此处的代码非常大,我附加了我的github repo https://github.com/DiegoGallegos4/Mongo
我正在尝试使用de NodeJS驱动程序来更新符合条件的某些记录,但首先我必须找到满足其他条件的一些记录。在更新部分,使用从查找操作中找到和过滤的记录。这是,
file: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)
}
})
用于解决问题的结构,关于何时关闭连接,当数据数组的长度等于更新操作的回调数时。有关详细信息,请参阅回购。
file:weather.js
在另一种方法中,使用 .each 代替 .Aarray 来迭代光标。
我已经在几个论坛上找了一个星期的解决方案。
我已经阅读了有关池连接但我想知道我的代码上的概念错误是什么。我非常感谢对此主题的深刻见解。
答案 0 :(得分: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();
}
});
});
这只是您的回购代码的副本,重构为使用流。因此,所有重要的部分都是“" stream"出现,最重要的是它们被称为。
简而言之,"数据"每个文档从游标结果发出事件。首先,您调用.pause()
,以便新文档不会超出处理范围。然后,当您致电.update()
时,执行.resume()
并在其内部回调,然后流程继续下一个文档。
最终"结束"在光标耗尽时发出,这就是你调用db.close()
的地方。
这是基本的流量控制。对于其他方法,请将node async库视为好帮手。但是不要循环没有异步控制的数组,也不要使用 DEPRECATED 的.each()
。
您需要在.update()
回调完成时发出信号,以跟随新的"循环迭代"好歹。这是基本的无附加依赖方法。
P.S我对你的代码的一般逻辑有点怀疑,尤其是当你在不改变那个长度的情况下读取它时,如果某个东西的长度更大的话。但这都是关于如何实现流量控制"而不是修复代码中的逻辑。