使用 mongodb 更新多个文档
update multiple documents with mongodb
如何迭代对象数组以使用 mongodb 更新文档并 将修改后的文档保存到 return 返回响应
注意代码中的注释
.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
});
})
因为 update
是异步的,所以你的 documents
是空的并且 return 立即。为每个更新创建承诺。同时创建一个外部承诺数组。将这些承诺推送到这个数组,并在所有完成后发送响应。我正在使用 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({})
}))
})
改用Promise.all()
and .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 })
});
不需要外部库。
如何迭代对象数组以使用 mongodb 更新文档并 将修改后的文档保存到 return 返回响应
注意代码中的注释
.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
});
})
因为 update
是异步的,所以你的 documents
是空的并且 return 立即。为每个更新创建承诺。同时创建一个外部承诺数组。将这些承诺推送到这个数组,并在所有完成后发送响应。我正在使用 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({})
}))
})
改用Promise.all()
and .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 })
});
不需要外部库。