Использование вложенных документов в пн goose - эффективное сохранение документов - PullRequest
0 голосов
/ 14 апреля 2020

Я пытался обработать данные для профессионального проекта, касающиеся медицинских экзаменов, и в последнее время он проверял мои пределы.

В любом случае, мои требования состоят в хранении данных из 2 внешних API, которые возвращают каждый JSON с массивом объектов (экзамены и лабораторные работы) таким образом, что экзамен содержит лабораторные работы (так что экзамены могут быть найдены в массиве лабораторных работ).

Проблема, с которой я сталкиваюсь, заключается в том, что я У меня проблемы с одновременным использованием нескольких сбережений с использованием mon goose, но я не могу найти способ обойти это.

Ради того, чтобы избавить вас от всего длинного содержимого этих API, я Собираюсь немного упростить мои схемы, хорошо?

Ниже они. Обратите внимание, что я ссылаюсь на схему Lab внутри экзамена, поэтому я могу использовать функцию поддокументов mon goose.

Архив: модели / экзамен. js

const mongoose = require('mongoose');

const Lab = require('./Lab');

const ExamSchema = new mongoose.Schema({
  exam_name: {
      type: String,
      trim: true,
      required: true,
      unique: true,
  },
  labs:[{
    exam_price: {
      type: Number,
      min: 0,
    },
    lab: { type: mongoose.Schema.Types.ObjectId, ref: 'Lab' },
    lab_name: String,
    lab_company: String,
  }],
}, {strict: false});

const Exam = mongoose.model('Exam', ExamSchema);

module.exports = Exam;

Архив: модели / Lab. js

const mongoose = require('mongoose');

const LabSchema = new mongoose.Schema({
    lab_name: {
      type: String,
      trim: true,
      required: true,
    },
    lab_company: {
      type: String,
      trim: true,
}, {strict: false});


const Lab = mongoose.model('Lab', LabSchema);

module.exports = Lab;

Архив: /scrapers/LabX/dataprocessor.js

const db = require('../../db');

// Initiate connection to MongoDB
db;

// Require schemas
const Exam = require('../../models/Exam');
const Lab = require('../../models/Lab');

// Require sample json
const examsArray = require('./examsArray');
const labsArray = require('./labsArray');

const updateData = async () => {
// 1) Map the exam array, so that I can update them in MongoDB
  examsArray.map( item => {
    const { title, price } = item;
    const exam_name = title;
    const exam_price = price;

// 2) Update data inside exams collection in MongoDB

    Exam.findOneAndUpdate({'exam_name': exam_name}, {'exam_name': exam_name}, {
      upsert: true,
      new: true
    }).then( async exams => {

// 3) Map the lab array, so that I can update them in MongoDB
        labsArray.map( async item => {
          const { title } = item;
          const lab_name = title;

// 4) Search for lab_name in Lab collection and update with newest data
          const updateLab = {
            lab_name,
            lab_company: 'LabX',
          };

          Lab.findOneAndUpdate({lab_name: lab_name}, updateLab, {
            upsert: true,
            new: true
          }).then( labs => {

// 5) Push lab data to exam collection
              const labsToPush = {
                exam_price: exam_price,
                lab: labs._id,
                lab_name: labs.lab_name,
                lab_company: 'LabX',
              }

              function pushLabsToExams (callback) {
                exams.labs.push(labsToPush);
                callback(exams);
              }

              pushLabsToExams(saveDocument);

          }).catch(err => console.error(err));
      });

      saveDocument(exams);

    }).catch(err => console.error(err));
  });
}

function saveDocument(doc) {
  doc.save();
  checkSave();
}

function checkSave(err) {
  if (err) return console.log(err);
        console.log('Sucessfully saved document!');
}


updateData();

Извините за длинный код. Вкратце: я пытаюсь обновить обе коллекции (экзамены и лабораторные работы), а затем добавить pu sh каждый лабораторный документ в массив внутри каждого экзаменационного документа. Проблема заключается в следующем: я продолжаю получать эту ошибку в консоли (6 раз, поскольку мой тест выполняется с 6 вставками вложенных документов):

(node:16596) UnhandledPromiseRejectionWarning: ParallelSaveError: Can't save() the same doc multiple times in parallel. Document: 5e94cbf68c692a189e02ed43

Кто-нибудь видит какое-либо решение этой проблемы?

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...