javascript - NodeJS 在一个请求中更新多个 MongoDB 文档是成功还是失败
问题描述
我有一个 NodeJS 请求,它在一个请求中更新多个集合。它有时按预期工作,有时只更新一些文档或集合。
这是我的代码:
router.post('/requestAccept', async (req, res) => {
if (req.body.sumDebit != req.body.sumCredit) return res.json({ success: false, message: 'Accepted debit not equal to accepted credit.' });
if (req.body.sumDebit < 0) return res.json({ success: false, message: 'Invalid amount.' });
if (req.body.minAccept != req.body.sumDebit) return res.json({ success: false, message: 'Allowed amount to accept is: ' + req.body.minAccept });
if (!req.body.sumCredit || req.body.sumCredit < 0) return res.json({ success: false, message: 'Invalid amount.' });
if (!req.body.ticketNumber ) return res.json({ success: false, message: 'Unexpected TIC error.' });
if (!req.body.mainId ) return res.json({ success: false, message: 'Unexpected MAI error.' });
if (!req.body.requestId ) return res.json({ success: false, message: 'Unexpected REQ error.' });
if (!req.body.eeid ) return res.json({ success: false, message: 'Unexpected EEI error.' });
requestMainId = new ObjectID(req.body.mainId);
requestSubId = new ObjectID(req.body.requestId);
try {
//FIRST FUNCTION, FIND
const findAccepted = await FinancialRequest.aggregate([
{ $unwind: { path: "$requests", preserveNullAndEmptyArrays: true } },
{
$project: {
_id: 1,
'subId': "$requests._id",
'status': "$requests.status",
}
},
{ $match: { $and: [{ _id: requestMainId, subId: requestSubId, status: 'Accepted' }] } },
]);
if (findAccepted.length > 0 ) return res.json({ success: false, message: 'Unexpected error. Please reload your system' });
//SECOND FUNCTION, UPDATE CREDIT DOCUMENT
for (let i = 0; i < req.body.credit.length; i++) {
const credit = await Financial.updateOne({ accountNumber: req.body.credit[i].creditAccountNumber },
{
$push:
{
"transactions":
{
ticketNumber: req.body.ticketNumber,
mainId: req.body.mainId,
requestId: req.body.requestId,
requestType: req.body.requestType,
type: 'Credit',
eeid: req.body.eeid,
firstName: req.body.firstName,
lastName: req.body.lastName,
amount: req.body.credit[i].amountAccepted,
date: new Date(),
}
}
},
)
}
//THIRD FUNCTION, UPDATE DEBIT DOCUMENT
for (let j = 0; j < req.body.debit.length; j++) {
const debit = await Financial.updateOne({ accountNumber: req.body.debit[j].debitAccountNumber },
{
$push:
{
"transactions":
{
mainId: req.body.mainId,
ticketNumber: req.body.ticketNumber,
requestId: req.body.requestId,
requestType: req.body.requestType,
type: 'Debit',
eeid: req.body.eeid,
firstName: req.body.firstName,
lastName: req.body.lastName,
amount: req.body.debit[j].amountAccepted,
date: new Date(),
}
}
},
)
}
//FOURTH FUNCTION, UPDATE CREDIT REQUEST DOCUMENT
for (let k = 0; k < req.body.credit.length; k++) {
const updateRequest = await FinancialRequest.updateOne({ _id: req.body.mainId },
{
$set: {
"requests.$[l].credits.$[m].amountAccepted": req.body.credit[k].amountAccepted,
"requests.$[l].credits.$[m].dateAccepted": new Date(),
"requests.$[l].credits.$[m].status": 'Accepted',
},
},
{ arrayFilters: [{ "l._id": req.body.requestId }, { "m._id": req.body.credit[k]._id }] });
}
//FIFTH FUNCTION, UPDATE DEBIT REQUEST DOCUMENT
for (let n = 0; n < req.body.debit.length; n++) {
const updateRequest = await FinancialRequest.updateOne({ _id: req.body.mainId },
{
$set: {
"requests.$[o].debits.$[p].amountAccepted": req.body.debit[n].amountAccepted,
"requests.$[o].debits.$[p].dateAccepted": new Date(),
"requests.$[o].debits.$[p].status": 'Accepted',
},
},
{ arrayFilters: [{ "o._id": req.body.requestId }, { "p._id": req.body.debit[n]._id }] });
}
//SIXTH FUNCTION, MAIN REQUEST DOCUMENT
const updateStatus = await FinancialRequest.updateOne({ _id: req.body.mainId }, {
$set: {
"requests.$[o].dateAccepted": new Date(),
"requests.$[o].status": 'Accepted',
},
}, { arrayFilters: [{ "o._id": req.body.requestId }] });
res.json({ success: true, message: 'Request Accepted' })
} catch (err) { res.json({ success: false, message: 'An error occured' }); }
});
如何确保所有文档都得到更新?第一个请求必须先执行,其他五个请求可能按顺序执行,也可能不按顺序执行。
解决方案
问题
问题是因为您在此行中返回响应:
if (findAccepted.length > 0) return res.json({ success: false, message: 'Unexpected error. Please reload your system' });
原因
因此,如果findAccepted.length > 0
为真,您的脚本将返回响应并且不会继续进行。
解决方案
您应该做的是执行所有五个查询并最终返回响应。
推荐阅读
- javascript - 查找第二个数组中具有指定属性的所有对象作为第一个数组中的对象
- python - HTTP POST 使用 dart 的 python 文件
- c# - UWP 应用诊断:System.AccessViolationException
- react-native - 将图像上传到 AWS S3
- kubernetes - K8s 升级算子失败
- oracle - 使用 LOOP UPTO MATCH SYSDATE 触发执行
- node.js - 无法使用 npm install -g expo-cli 安装 Expo Cli
- c# - ElasticSearch 精确匹配多个字段
- git - 将远程 bitbucket 存储库与下载的本地存储库同步
- reactjs - reactjs中的空格验证