我有一个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 ...
}
答案 0 :(得分:0)
threeDaysAgo和Today变量是包含在请求外部的常量。因此,当节点应用程序启动时,它们被设置为不可变的。 Mongo将返回适当的结果,直到第二天。然后mongo将停止提供“正确”的结果。我将对代码进行更改以进行测试,然后nodemon重新启动服务器以解决该问题。