MongoDB Aggregation - Добавить объект в массив и обновить количество объектов - PullRequest
0 голосов
/ 05 декабря 2018

Мне нравится создавать записи в коллекции 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;
}
...