Mongo并不总是返回正确的结果

时间:2019-04-08 22:25:42

标签: javascript node.js mongodb mongoose

我有一个nodeJS脚本正在处理排队的JSON请求。我们在Mongo(v3.6.3)中查询要处理的请求队列,然后在该队列上执行forEach。我们使用Promise查询API端点,然后使用async / await解析请求。

我们执行Mongo查询,以查看过去3天内是否有该患者的现有记录。我们使用findOne或find limit 1(已尝试同时尝试解决问题)来查找患者ID和药房ID。如果有现有记录,则对现有记录执行更新。否则,我们将创建一个新文档。这似乎在大多数时间都有效。但是,有时每个排队的条目将导致创建一个新文档。因此,如果队列中有4个完整的病人,我们将创建4个遭遇。我们可以清除数据库并再次处理队列,它将正常工作。它似乎在大多数时间都有效。该过程可以开始工作,然后在开始中断后不久。一旦我们创建了一条重复记录,队列中的所有其他项目最终将被创建为新条目。

我认为此问题与Mongo无法正确返回数据有关。有人目睹过这样的事情吗?

我们最近切换到查找并限制1以查看是否有帮助。我们已经多次处理了队列,并且代码可以正常工作,并且不会导致重复。我们注意到,当我们处理当天的第一个队列时,似乎会发生重复。但是,一天的第一个队列并不总是会导致错误。但是,这可能是偶然的。

我们如何查询和处理队列

  let token;
  (async () => {
    // Get Access Token
    token = await authenticate();

        PharmacyQueue.find({ $and: [{ archive: false }, { date: { $gte: today } }] })
      .then(results => {
        let queue = [];
        results.forEach(request => {
          queue.push(JSON.parse(request.rawJSON));
          request.archive = true;
          request.save().catch(err => {
            console.log('Unable to archive');
          });
        });

        return queue;
      })
      .then(async requests => {
        for (const request of requests) {
          let response = await parseRequest(token, request);
          // SLEEP NOT NEEDED - JUST ADDED TO GIVE US TIME TO WATCH DEBUG LOGS
          await sleep(1000);
          console.log(response);
        }
      })
      .then(() => {
        mongoose.disconnect();
      })
      .catch(err => console.log(err));
  })();

API上的代码以搜索现有记录-问题发生的位置。 我们只是从findOne切换到限制为1的查找

 // Search For existing Encounter
  PharmacyEncounter.find(
    {
      $and: [
        {
          'patient.patientId': patient.patientId
        },
        {
          'pharmacy.ehrId': pharmacy.ehrId
        },
        {
          date: {
            $gt: threeDaysAgo
          }
        },
        {
          date: {
            $lte: moment(today)
              .endOf('day')
              .toDate() //today +'T23:59:59'
          }
        }
      ]
    },
    '-rawJSON -analytics'
  )
    .limit(1)
    .then(results => {
      if (
        results &&
        results[0] &&
        results[0].patient.patientId
      ) {
        console.log('Encounter Exists');
        // Encounter Already exists

        // Check if Prescription is already attached to encounter
        let desc = 'Appended medication';
        results[0].prescription.filter(presc => {
          if (presc.rxNumber == prescription.rxNumber) {
            // Existing Medication with same rxNumber found

            // Get remove index
            const removeIndex = results[0].prescription
              .map(item => item.rxNumber.toString())
              .indexOf(prescription.rxNumber);
            // Splice out of array
            results[0].prescription.splice(removeIndex, 1);
            desc = 'Updated medication';
          }
        });

        // Append Prescription ( updated or new )
        results[0].prescription.push(prescription);
        results[0]
          .save()
          .then(savedRx => {
            res.json({
              status: 'SUCCESS',
              id: savedRx._id,
              desc
            });
          })
          .catch(err => {
            const error = JSON.stringify(err);
            res.status(500).json({ status: 'ERROR', desc: error });
          });
      } else {
        // New Encounter - Create Encounter
        ... more code here to process new encounter ...
      }

1 个答案:

答案 0 :(得分:0)

threeDaysAgo和Today变量是包含在请求外部的常量。因此,当节点应用程序启动时,它们被设置为不可变的。 Mongo将返回适当的结果,直到第二天。然后mongo将停止提供“正确”的结果。我将对代码进行更改以进行测试,然后nodemon重新启动服务器以解决该问题。