Mongoose:插入多个文档然后断开数据库?

时间:2015-10-24 06:39:37

标签: node.js mongodb mongoose

使用Mongoose将多个文档插入到集合中时,由于每个.save()方法都有自己的回调,因此您如何知道它们何时完整,以便mongoose.disconnect()可以?

假设我需要将3个文档插入数据库:

var database = mongoose.connect('mongodb://localhost/somedb');

document1.create({...}, function(err){
  if (err) { ... }
  // It's saved!
});

document2.create({...}, function(err){
  if (err) { ... }
  // It's saved!
});

document3.create({...}, function(err){
  if (err) { ... }
  // It's saved!
});

database.disconnect();

disconnect最有可能在文档保存到数据库之前发生,特别是如果Mongodb服务器是远程或慢速的话。

处理此问题的最佳方法是什么?承诺是唯一的方式吗?几年前Promise如此普遍之前,解决这个问题的方法是什么?

1 个答案:

答案 0 :(得分:0)

一个选项而不是使用promises是使用已存在多年的async库。有很好的帮助器,例如async.seriesasync.parallel,当所有提供的方法都完成时提供最终的函数调用,不同之处在于是否需要操作以串行方式完成(一个接一个)只需并行执行所有操作:

async.parallel(
    [
        function(callback) {
            document1.create({...},callback);
        },
        function(callback) {
            document2.create({...},callback);
        },
        function(callback) {
            document3.create({...},callback);
        },
    ],
    // Called when all completed or on an error
    function(err,results) {
       // err is any error
       // results contains an array ( in this case ) of any results
       mongoose.disconnect();
    }
)

由于任何一种情况下的第一个参数都是数组或包含函数调用的对象,因此只要第二个参数是收到任何错误的处理程序,您就可以构建所述数组/对象并将其传入。或者当一切都完成时执行。

所以你可以举例说#34; build"像这样:

var list = [
    { "model": "Model1", "data": {...} },
    { "model": "Model2", "data": {...} },
    { "model": "Model3", "data": {...} }
];

list = list.map(function(item) {
    return function(callback) {
        mongoose.model(item.model).create(item.data,callback);
    }
});

async.parallel(list,function(err,results) {
   // err is any error
   // results contains an array ( in this case ) of any results
   mongoose.disconnect();
});

这一切都与硬编码一样,但是以简单的程序方式。

当然,另一种自然的方法是简单地将每个调用嵌套在它们的回调中,但是如图所示的库旨在使事物变得更漂亮,更容易操作以创建这样的列表。