我正在编写一个脚本,该脚本应该获取集合中的文档数量,然后将它们全部打印出来,然后更新它们中的每一个,那就是我在运行它时遇到错误:MongoError:连接由应用程序关闭。 这是我的代码,我试图将db.close()放在几个没有帮助的地方。
var request = require('request');
var cheerio = require ('cheerio');
var fs = require('fs');
var MongoClient = require('mongodb').MongoClient;
var dbName = "yahooStocks";
var port = "27017";
var requiredCollection = "stocks"
var host = "localhost";
MongoClient.connect("mongodb://" + host + ":" + port + "/" + dbName, function (error, db){
if(error) throw error;
console.log ("Connected to: " + "mongodb://" + host + ":" + port + "/" + dbName);
function update () {
db.collection(requiredCollection).count({}, function (error, numOfDocs) {
if(error) throw error;
console.log("the number of docs is : " , numOfDocs);
for (i=1; i<10; i++) {
var findOneQuery = {'_id' : i};
db.collection(requiredCollection).findOne(findOneQuery, function (error, doc) {
if(error) throw error;
console.log(doc._id + ". Doc - > " , doc);
}); // end of findOne
//db.close();
}
db.close();
}); // end of count
}
update();
// db.close();
}); // end of connection to MongoClien
答案 0 :(得分:1)
您需要确保以异步方式运行这些查询。最好的方法是使用异步库。 (这个例子使用的是猫鼬)
使用异步库:https://github.com/caolan/async
var queries = [];
for (i=1; i<10; i++) {
queries.push(db.collection(requiredCollection).findOne({'_id' : i}));
}
async.each(queries, function(query, callback) {
query.exec(function(err, doc) {
if (err) callback(err);
console.log(doc._id + ". Doc - > " , doc);
// do things here
callback();
});
}, function(err) {
// when everything is complete.
});
答案 1 :(得分:0)
您已经计数, findOne 的回调中的简单倒计时怎么样?因此,您可以知道循环中的所有操作何时全部完成,并安全地调用db.close()
。