如何迭代一组对象以使用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
});
})
答案 0 :(得分:2)
改为使用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 })
});
不需要外部库。
答案 1 :(得分:1)
由于update
是异步的,因此documents
为空并立即返回。为每个更新创建承诺。还要创建一个外部promise数组。将这些promise推送到此数组,并在完成所有操作后发送响应。我正在使用Q library
.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({})
}))
})