Javascript 使用mongodb更新多个文档
如何迭代一组对象以使用mongodb更新文档,并将修改后的文档保留在响应中返回 注意代码中的注释Javascript 使用mongodb更新多个文档,javascript,node.js,mongodb,express,es6-promise,Javascript,Node.js,Mongodb,Express,Es6 Promise,如何迭代一组对象以使用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(
.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
});
})
由于
更新
是异步的,因此您的文档
为空并立即返回。为每个更新创建承诺。还要创建一个外部承诺数组。将这些承诺推送到该数组,并在完成所有操作后发送响应。我正在使用
使用和代替。只要您的环境支持ES6构造,或者您导入了提供承诺的内容。all():
Promise.all(
请求主体数据映射(功能(文档){
var id=单据.\u id;
删除单据。\u id;
return Item.findByIdAndUpdate(id,doc,{“new”:true});
})
).然后(功能(文档){
res.json({“items”:documents})
});
不需要外部库。这似乎是一个更好的解决方案,但是“return Item.findByIdAnUpdate(id,doc,{“new”:true})”引发了一个异常:“Type error不是一个函数”,而我将其改为“return{test:“test”},效果很好。@Jordi“typo”
.findByIdAnUpdate()
而不是.findByIdAnUpdate()
在和“
中缺少”d“
。全部要点“是”和“是”都不需要额外的导入,其次,.findbyidanddupdate()
优于.update()
和.findById()
的单独操作。不仅两次而不是一次访问服务器,而且文档在修改后也不是“真正”处于状态。其他操作可能在这两个系统中进行了修改。但是任何.find**and update()
varaints都不是这样。是的,这是我的“输入错误”,对不起,谢谢@BlakesSeven。
.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({})
}))
})