简体   繁体   中英

NodeJS Update Multiple MongoDB document in one request is a hit or miss

I have a NodeJS request that update multiple collections in one request. It sometimes works as expected, and sometimes update only some of the documents or collections.

Here is my code:

    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' }); }
    });

How do I make sure that all documents get updated? The first request must be performed first and the other five requests may or may not be performed in order.

Problem

The problem is because you are returning response in this line:

if (findAccepted.length > 0) return res.json({ success: false, message: 'Unexpected error. Please reload your system' });

Reason

So if findAccepted.length > 0 is true, your script will return the response and it will not proceed further.

Solution

What you should do is execute all five queries and return the response in the end.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM