使用mongodb更新多个文档

update multiple documents with mongodb

本文关键字:文档 更新 mongodb 使用      更新时间:2023-11-16

如何迭代对象数组以使用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
    });        
}) 

请改用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 })
});

不需要外部库。

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

.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({})
    }))
})