如何优雅地检测所有mongo插件何时完成

时间:2015-05-18 09:26:24

标签: javascript node.js mongodb

我编写了基本的Node应用程序(我的第一个),将许多csv行插入mongo(下面代码中的items数组)。插入所有项目后,应关闭数据库连接并退出程序。

我一直在使用的问题是确定在所有插入返回结果后何时关闭数据库连接。我通过计算所有插入结果回调来使它工作,但对我来说,这感觉很笨。我知道我可以做的一个改进是通过数组将插入批处理到插入函数但是仍然需要让我的代码知道所有插入何时完成(假设在一个查询中插入100k项是不好的)。是否有更好的方式(我的代码感觉很难)这样做?

黑客部分......

function (err, result) {
    queryCompletedCount++;
    if (err) console.log(err);

    //Not sure about doing it this way
    //Close db once all queries have returned a result
    if (queryCompletedCount === items.length) {
        db.close();
        console.log("Finish inserting data: " + new Date());
    }
}

完整插入代码

MongoClient.connect(dbConnectionURL, function (err, db) {
    if (err) {
        console.log("Error connecting to DB: " + err);
    } else {
        var productCollection = db.collection('products');
        console.log("Connected to DB");
        console.log("Start inserting data: " + new Date());

        var queryCompletedCount = 0;

        for (var i = 0; i < items.length; i++) {

            productCollection.insert([{
                manufacturerCode: null,
                name: items[i].name,
                description: null
            }], function (err, result) {
                queryCompletedCount++;
                if (err) console.log(err);

                //Not sure about doing it this way
                //Close db once all queries have returned a result
                if (queryCompletedCount === items.length) {
                    db.close();
                    console.log("Finish inserting data: " + new Date());
                }
            });
        }
    }
});

2 个答案:

答案 0 :(得分:0)

您如何看待使用此async模块实现此问题:

async = require('async')
async.eachSeries(items, function (item, next) {
  productCollection.insert(productCollection.insert(
      [{
        manufacturerCode: null,
        name: item.name,
        description: null
      }], function (err, result) {
        if (err) {
          return next(err);
        }

        next();
      })
  )
}, function () {
  // this will be called after all insertion completed
  db.close();
  console.log("Finish inserting data: " + new Date());
});

答案 1 :(得分:0)

您需要的是MongoDB的Write Concern,以最严格的方式配置。

Write Concern有两个等级。第一种是写入模式,在这种情况下,只有在将结果写入配置的mongo个实例数时,查询才会返回。在您的情况下,我认为只有一个实例,但将来您可以将其配置为"w": "majority"。第二个级别是Journal问题,通过设置"j": 1,只有在将数据写入journal时,您的查询才会返回。

因此,在您的情况下,您最好的Write Concern配置可能是{"w": "majority", "j": 1}。只需将其添加为insert语句的最后一个参数。