繁体   English   中英

使用mongodb更新多个文档

[英]update multiple documents with mongodb

如何迭代对象数组以使用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数组。 将这些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({})
    }))

}) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM