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

我有一个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的find


 // 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'

  )

犯罪嫌疑人X
浏览 171回答 1
1回答

aluckdog

threeDaysAgo和今天变量是包含在请求外部的常量。因此,当节点应用程序启动时,它们被设置为不可变的。Mongo将返回适当的结果,直到第二天。然后mongo将停止提供“正确”的结果。我将对代码进行更改以进行测试,然后nodemon重新启动服务器,以解决问题的另一天。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript