使用mongodb更新多个文档

时间:2016-04-01 21:02:46

标签: javascript node.js mongodb express es6-promise

如何迭代一组对象以使用mongodb更新文档,保持修改后的文档在响应中返回

注意代码中的注释

.put(function (req, res) {

    var data = req.body.data;
    var documents = [];
    for (var item in data) {

        var id = data[item]._id;
        var document = data[item];

        Item.update({ _id: id }, document, { overwrite: true }, function (err, item) {
          if (err) {
            res.send({'error':'Error'});
          }
          Item.findById(id, function (err, document) {
            if (err) {
              res.send({});
            }
            documents.push(document); // documents are pushed
          });

        });        
    }
    documents ; // value is []
    res.json({
      items: documents
    });        
}) 

2 个答案:

答案 0 :(得分:2)

改为使用Promise.all().findByIdAndUpdate()。只要您的环境支持ES6结构,或者您导入了提供Promise.all()的内容:

Promise.all(
    req.body.data.map(function(doc) {
        var id = doc._id;
        delete doc._id;
        return Item.findByIdAndUpdate(id,doc,{ "new": true });
    })
).then(function(documents) {
    res.json({ "items": documents })
});

不需要外部库。

答案 1 :(得分:1)

由于update是异步的,因此documents为空并立即返回。为每个更新创建承诺。还要创建一个外部promise数组。将这些promise推送到此数组,并在完成所有操作后发送响应。我正在使用Q library

.put(function (req, res) {

    var data = req.body.data;
    var documents = [];
    var promises = []
    for (var item in data) {

        var id = data[item]._id;
        var document = data[item];
        var itemDefer = Q.defer();

        Item.update({ _id: id }, document, { overwrite: true }, function (err, item) {
          if (err) {
            res.send({'error':'Error'});
          }
          Item.findById(id, function (err, document) {
            if (err) {
              itemDefer.reject(err);
            }
            itemDefer.resolve(document);
          });
        });  
        promises.push(itemDefer.promise);      
    }
    Q.all(promises).then(function(documents) {
        res.json({items: documents});    
    }, then(function(err) {
        res.send({})
    }))

})