MongoDB Node JS 驱动程序,如何知道.updates 何时完成
MongoDB NodeJS driver, how to know when .update() 's are complete
由于代码太大,无法张贴在这里,我附加了我的 github 存储库 https://github.com/DiegoGallegos4/Mongo
我正在尝试使用 de 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)
}
})
这是用于解决问题的结构,涉及何时关闭连接,即当数据数组的长度等于更新操作的回调数时。有关更多详细信息,您可以参考回购协议。
文件:weather.js
在另一种方法中,使用 .each 代替 toArray 来迭代游标。
我已经在几个论坛上查找了一个星期的解决方案。
我读过有关连接池的内容,但我想知道我的代码中存在什么概念性错误。如果能深入了解这个主题,我将不胜感激。
你提出问题的方式非常具有误导性。你只想知道"When is the processing complete so I can close?".
答案是您需要尊重回调,通常只有在每次更新完成后才通过结果光标移动。
没有其他依赖的简单方法是使用驱动程序支持的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" 出现的地方,最重要的是它们被调用的地方。
简而言之,"data" 事件是由游标结果中的每个文档发出的。首先你调用 .pause()
这样新文档就不会超出处理范围。然后您执行 .update()
并在 return 的回调中调用 .resume()
,流程继续下一个文档。
最终 "end" 在光标耗尽时发出,这就是您调用 db.close()
.
的地方
这就是基本的流量控制。其他的方法,看看node async库这个好帮手。但是不要在没有异步控制的情况下循环数组,也不要使用 DEPRECATED.
的 .each()
您需要在 .update()
回调完成时发出信号,以便无论如何跟随新的 "loop iteration"。这是基本的无附加依赖方法。
P.S 我对您的代码的一般逻辑有点怀疑,尤其是测试当您阅读某些内容的长度而不可能更改该长度时,它是否更长。但这都是关于如何实现 "flow control",而不是修复代码中的逻辑。
由于代码太大,无法张贴在这里,我附加了我的 github 存储库 https://github.com/DiegoGallegos4/Mongo
我正在尝试使用 de 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)
}
})
这是用于解决问题的结构,涉及何时关闭连接,即当数据数组的长度等于更新操作的回调数时。有关更多详细信息,您可以参考回购协议。
文件:weather.js
在另一种方法中,使用 .each 代替 toArray 来迭代游标。
我已经在几个论坛上查找了一个星期的解决方案。
我读过有关连接池的内容,但我想知道我的代码中存在什么概念性错误。如果能深入了解这个主题,我将不胜感激。
你提出问题的方式非常具有误导性。你只想知道"When is the processing complete so I can close?".
答案是您需要尊重回调,通常只有在每次更新完成后才通过结果光标移动。
没有其他依赖的简单方法是使用驱动程序支持的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" 出现的地方,最重要的是它们被调用的地方。
简而言之,"data" 事件是由游标结果中的每个文档发出的。首先你调用 .pause()
这样新文档就不会超出处理范围。然后您执行 .update()
并在 return 的回调中调用 .resume()
,流程继续下一个文档。
最终 "end" 在光标耗尽时发出,这就是您调用 db.close()
.
这就是基本的流量控制。其他的方法,看看node async库这个好帮手。但是不要在没有异步控制的情况下循环数组,也不要使用 DEPRECATED.
的.each()
您需要在 .update()
回调完成时发出信号,以便无论如何跟随新的 "loop iteration"。这是基本的无附加依赖方法。
P.S 我对您的代码的一般逻辑有点怀疑,尤其是测试当您阅读某些内容的长度而不可能更改该长度时,它是否更长。但这都是关于如何实现 "flow control",而不是修复代码中的逻辑。