我有以下從查詢它通過市,然後溫度排序collectoin創建光標簡單的Node.js應用程序時,通過應用程序錯誤關閉。之後,我遍歷遊標並通過添加最高值:true來爲每個城市更新每個城市最高氣溫的每個文檔。連接通過光標迭代和更新文件
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/temp', function(err, db) {
if(err) throw err;
var cursor = db.collection('data').find().sort({ City : 1, Temperature : -1 });
var previous = '';
cursor.each(function(err, doc) {
if(err) throw err;
if(doc == null) {
console.dir("Closing database connection");
return db.close();
}
if (previous != doc.City) {
previous = doc.City;
var query = { _id : doc._id };
var operator = { '$set' : { highest : true } };
console.dir(doc.City + " is " + doc.Temperature + "; ");
db.collection('data').update(query, operator, function(err, updated) {
if(err) {
console.error('Error:', err);
throw err;
}
console.dir("Successfully updated: " + JSON.stringify(updated));
});
}
});
});
這裏的問題是,只有第一個城市得到適當的更新,這裏是輸出:
'Berlin is 81; ' 'Successfully updated: 1' 'Paris Florida is 83; ' 'Warsaw New Mexico is 57; ' 'Barcelona Vermont is 57; ' 'Closing database connection' Error: { [MongoError: Connection Closed By Application] name: 'MongoError' } Error: { [MongoError: Connection Closed By Application] name: 'MongoError' } Error: { [MongoError: Connection Closed By Application] name: 'MongoError' }
我對所發生的事情的猜測是:將光標經過所有文件上的那些要求更新最高溫度:
db.collection('data').update(query, operator, function(err, updated)
但回調返回,光標完成之前迭代和該片段的代碼被稱爲封閉連接:
if(doc == null) {
console.dir("Closing database connection");
return db.close();
}
之後,所有未完成處理的更新都會出錯,因爲沒有數據庫連接可用。
使連接所有文件都成功更新後,才關閉有什麼處理它的正確方法?