为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

犯罪嫌疑人X 2021-04-07 16:19:08
我有一个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'  )
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-04-22
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信