我有一個(gè)nodeJS腳本正在處理排隊(duì)的JSON請(qǐng)求。我們?cè)贛ongo(v3.6.3)中查詢要處理的請(qǐng)求隊(duì)列,然后在該隊(duì)列上執(zhí)行forEach。我們使用Promise查詢API端點(diǎn),然后使用async / await解析請(qǐng)求。我們執(zhí)行Mongo查詢,以查看過(guò)去3天內(nèi)是否有該患者的現(xiàn)有記錄。我們使用findOne或find limit 1查找患者ID和藥房ID(已嘗試同時(shí)嘗試解決問(wèn)題)。如果有現(xiàn)有記錄,則對(duì)現(xiàn)有記錄執(zhí)行更新。否則,我們將創(chuàng)建一個(gè)新文檔。這似乎在大多數(shù)時(shí)間都有效。但是,有時(shí)每個(gè)排隊(duì)的條目將導(dǎo)致創(chuàng)建一個(gè)新文檔。因此,如果隊(duì)列中有4個(gè)完整的病人,我們將創(chuàng)建4個(gè)遭遇。我們可以清除數(shù)據(jù)庫(kù)并再次處理隊(duì)列,它將正常工作。它似乎在大多數(shù)時(shí)間都有效。該過(guò)程可以開始工作,然后在開始中斷后不久。一旦我們創(chuàng)建了一條重復(fù)記錄,隊(duì)列中的所有其他項(xiàng)目最終將被創(chuàng)建為新條目。我認(rèn)為問(wèn)題與Mongo無(wú)法正確返回?cái)?shù)據(jù)有關(guān)。有人目睹過(guò)這樣的事情嗎?我們最近切換到查找并限制1以查看是否有幫助。我們已經(jīng)多次處理了隊(duì)列,并且代碼有效,并且不會(huì)導(dǎo)致重復(fù)。我們注意到,當(dāng)我們處理一天的第一個(gè)隊(duì)列時(shí),似乎發(fā)生了重復(fù)。但是,一天的第一個(gè)隊(duì)列并不總是會(huì)導(dǎo)致錯(cuò)誤。但是,這可能并且很可能是巧合。我們?nèi)绾尾樵兒吞幚黻?duì)列 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上的代碼以搜索現(xiàn)有記錄-發(fā)生問(wèn)題的位置。我們剛剛從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' )
Mongo并不總是返回正確的結(jié)果
犯罪嫌疑人X
2021-04-07 16:19:08