[英]NodeJS Update Multiple MongoDB document in one request is a hit or miss
我有一個 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
為真,您的腳本將返回響應並且不會繼續進行。
您應該做的是執行所有五個查詢並最終返回響應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.