簡體   English   中英

NodeJS 在一個請求中更新多個 MongoDB 文檔是成功還是失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM