Мне нравится создавать записи в коллекции mongodb для пользователей с курсами, которые он смотрел.Если он закончил курс, он должен быть обновлен в поле complete_courses.Для этой операции я трижды нажимаю на базу данных для следующих операций.
- Создание новой записи
- Не найдено ни одного курса, который он завершил.
- Обновить поле complete_courses.
Может кто-нибудь предложить альтернативные методы для упрощения операции, чтобы я попадал в базу данных один или два раза.
Модель
const userCourseListSchema = new Schema({
course_id: {
type: Number,
required: true
},
completed:{
type:Boolean
}
});
const userCourseStatusSchema = new Schema({
user_id: {
type: Number,
unique: true,
required: [true, 'Invalid User ID']
},
completed_courses:{
type:Number
},
courselist:{
type: [userCourseListSchema]
}
});
Вход
{
"course_id":1,
"completed":true
}
Ожидаемый выход
{
"user_id":1,
"completed_courses":1,
"courselist":[
{
"course_id":1,
"completed":true
}
]
}
Метод работы
async updateCourse(){
let newUserCourseData ={
user_id:1,
completed_courses:0,
courselist:{
"course_id":1,
"completed":true
}
};
await UserCourseStatusModel.create(newUserCourseData);
let watchCount = await this.totalWatchCount(1);
let result = await UserCourseStatusModel.findOneAndUpdate({user_id:1}, {$set:{completed_courses:watchCount} }, {new: true, upsert:true}).exec();
return {result};
}
async totalWatchCount(userId){
let watchCourses = await UserCourseStatusModel.aggregate([
{
$match:{
user_id:userId
}
}
]).exec();
let watcher = watchCourses[0].courselist;
let watchCourseCount = 0;
for (let val in watcher){
if(watcher[val].completed===true){
watchCourseCount++;
}
}
return watchCourseCount;
}