首页 > 解决方案 > 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' }); }
    });

如何确保所有文档都得到更新?第一个请求必须先执行,其他五个请求可能按顺序执行,也可能不按顺序执行。

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


问题

问题是因为您在此行中返回响应:

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

原因

因此,如果findAccepted.length > 0为真,您的脚本将返回响应并且不会继续进行。

解决方案

您应该做的是执行所有五个查询并最终返回响应。


推荐阅读