У меня есть скрипт nodeJS, который обрабатывает запросы JSON в очереди. Мы запрашиваем у Mongo (v3.6.3) очередь запросов для обработки, а затем выполняем forEach в очереди. Мы запрашиваем нашу конечную точку API, используя промисы и async/await для анализа запроса.
Мы выполняем запрос Mongo, чтобы узнать, есть ли у нас существующая запись для пациента за последние 3 дня. Мы ищем идентификатор пациента и идентификатор аптеки с помощью findOne или находим лимит 1 (пробовали оба варианта в попытке решить проблему). Если у нас есть существующая запись, мы выполняем обновления существующей записи. В противном случае мы создаем новый документ. Кажется, это работает большую часть времени. Однако иногда каждая запись в очереди приводит к созданию нового документа. Таким образом, если у нас есть 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.info('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.info(response);
}
})
.then(() => {
mongoose.disconnect();
})
.catch(err => console.info(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.info('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 ...
}
Переменные threeDaysAgo и Today были константами, содержащимися вне запроса. Таким образом, они были установлены неизменными при запуске приложения узла. Монго будет возвращать правильные результаты до следующего дня. Тогда монго перестанет давать «правильные» результаты. Я бы внес изменения в код для тестирования, и nodemon перезапустил сервер, решив проблему на другой день.