简体   繁体   English

NodeJS 在一个请求中更新多个 MongoDB 文档是成功还是失败

[英]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.我有一个 NodeJS 请求,它在一个请求中更新多个集合。 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.因此,如果findAccepted.length > 0为真,您的脚本将返回响应并且不会继续进行。

Solution解决方案

What you should do is execute all five queries and return the response in the end.您应该做的是执行所有五个查询并最终返回响应。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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