簡體   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