除了此功能之外,还有其他方法可以关闭MongoDB连接吗?

时间:2019-06-06 09:12:33

标签: javascript mongodb

我有一个很大的数据集,我需要从我的node.js应用程序上传到mongo数据库,它通过for循环运行以获取所有结果。最初,我在每个循环中都连接到MongoDB,但这导致它崩溃。

由于我将其移出了循环,db.close()导致了问题,如果我将其留在循环中,则会关闭连接(由于未在循环中重新建立连接,导致应用程序崩溃): MongoError: server instance pool was destroyed

但是,如果我将其移出循环,它将被卡住而不离开循环并继续执行其他操作。

有人知道如何才能在for循环之外有效地关闭数据库连接,而仅在完成循环之后?

MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    var dbo = db.db("mydatabase");
    //run sql query to get data

    for(result in sqldata) {

        myobj = {Number: sqldata[result].Num} //<--- this for loop produces 16000 entries

        dbo.collection("customers").insertOne(myobj, function(err, res) {
          if (err) throw err;
          console.log("1 document inserted");
          db.close(); //<--- this is the issue
    });
    }
  });

1 个答案:

答案 0 :(得分:1)

您可以await进行插入操作。

MongoClient.connect(url, async (err, db) => {
    if (err) throw err;
    var dbo = db.db("mydatabase");
    let results = [];
    //run sql query to get data

    for(result in sqldata) {
        myobj = {Number: sqldata[result].Num} //<--- this for loop produces 16000 entries

        results.push(
            new Promise((resolve) => {
                dbo.collection("customers").insertOne(myobj, (err, res) => {
                    console.log(err ? 'Document not inserted' : 'Document inserted');
                    resolve();
                })
            })
        );
    }

    await Promise.all(results);

    db.close();
});