我有一个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重新启动服务器,以解决问题的另一天。
添加回答
举报
0/150
提交
取消