Я пытался обработать данные для профессионального проекта, касающиеся медицинских экзаменов, и в последнее время он проверял мои пределы.
В любом случае, мои требования состоят в хранении данных из 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
Кто-нибудь видит какое-либо решение этой проблемы?
Большое спасибо!