Mongo не всегда возвращает правильные результаты

У меня есть скрипт 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 ...
      }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переменные threeDaysAgo и Today были константами, содержащимися вне запроса. Таким образом, они были установлены неизменными при запуске приложения узла. Монго будет возвращать правильные результаты до следующего дня. Тогда монго перестанет давать «правильные» результаты. Я бы внес изменения в код для тестирования, и nodemon перезапустил сервер, решив проблему на другой день.

Другие вопросы по теме