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

       

网上收集的解决方案 "用mongodb更新多个文档"

改用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是asynchronous的,您的documents是空的,并立即返回。 为每个更新创build承诺。 还创build一个外部承诺数组。 将这些承诺推送到这个数组,并在完成时发送响应。 我正在使用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({}) })) })