[英]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.