使用Node.js驱动程序打印和更新MongoDB中的所有文档

时间:2014-08-25 19:50:52

标签: javascript node.js mongodb mongoose

我正在编写一个脚本,该脚本应该获取集合中的文档数量,然后将它们全部打印出来,然后更新它们中的每一个,那就是我在运行它时遇到错误: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

2 个答案:

答案 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()