Поиск предложений по схеме MongoDB - PullRequest
0 голосов
/ 24 апреля 2020

Я относительно новичок в MongoDB, и мне интересно, каким будет "лучшее" решение для обработки следующего типа данных в моей базе данных.


Коллекции:

  • Пользователи

  • Уроки

Обзор:

Примечание. Представьте, что реализация похожа на Duolin go или какой-либо другой учебный сайт.

Пользователи имеют все стандартное обобщенное c информация о пользователе , но они также должны отслеживать, сколько очков, выученных слов, выполненного процента и т. д., которые они имеют за каждый данный урок , которые они имеют начал.

Уроки имеют такие данные, как: изученные слова, общее количество баллов, слова для обзора и т. Д. c.


Изображение

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

What a user would see in the widget when they view a lesson's overview that they've already started


Так какой хороший способ справиться с этим? Я чувствую, что мне понадобится как минимум коллекция для пользователей и уроков , но где я буду хранить данные этого пользователя, указанные c, относящиеся к урокам, которые они извлекли?

То, о чем я думал до сих пор ...

// user collection
const UserSchema = new mongoose.Schema({
  email: { type: String, required: true, unique: true },
  username: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  firstName: { type: String },
  lastName: { type: String },
  gender: { type: String, enum: ['male', 'female', 'other'] },
  admin: Boolean,

  address: {
    street: String,
    city: String,
    state: {
      type: String,
      uppercase: true,
      required: true,
      enum: statesArray,
    },
    zip: Number,
  },

});

// lesson_results collection
const LessonResultsSchema = new mongoose.Schema({
  user_id: Schema.Types.ObjectId,
  results: [
    {
      id: Number,
      lesson_id: Schema.Types.ObjectId,
      pointsEarned: Number,
      wordsLearned: Number,
      wordsToPractice: [
        {
          id: Number,
          correct: Number,
          incorrect: Number,
          bookmarked: Boolean,
        },
      ],
    },
  ],
});

// lesson collection
const LessonSchema = new mongoose.Schema({
    title: String,
    description: String,
    totalPoints: Number,
    totalWords: Number,
    words: [
      { 
        id: Number,
        word: String,
        points: Number
      }
    ]
})


     // if logged in
      // find user in user collection 
      // find user's results in lessonsResults collection by using user_id
      // iterate over each result to find their lesson & lesson's data
      // combine data and send to frontend
      // calculate percentage complete + other calculations
      // render aggregate data on screen

Мне интересно, как вы решите это.

Извините, если это немного затянуто! (+ надеюсь, что примеры имеют смысл)

1 Ответ

0 голосов
/ 24 апреля 2020

У вас должна быть ссылка на пользователя в LessonSchema, чтобы вы могли отслеживать, сколько уроков взял пользователь.

const LessonSchema = new mongoose.Schema({
    user:{type:mongoose.Schema.Types.ObjectId,ref:'UserSchema',required:true},
    title: String,
    description: String,
    totalPoints: Number,
    totalWords: Number,
    words: [
      { 
        id: Number,
        word: String,
        points: Number
      }
    ]
})

И вам необходимо сохранить FLAG в LessonResultsSchema, чтобы отслеживать, закончил ли пользователь этот урок или нет. Как только урок закончен, вам нужно обновить pointsEarned, чтобы вы могли получить обновленные данные о баллах.

const LessonResultsSchema = new mongoose.Schema({
  user_id: Schema.Types.ObjectId,
  completed:{type:Boolean, default:0},
  results: [
    {
      id: Number,
      lesson_id: Schema.Types.ObjectId,
      pointsEarned: Number,
      wordsLearned: Number,
      wordsToPractice: [
        {
          id: Number,
          correct: Number,
          incorrect: Number,
          bookmarked: Boolean,
        },
      ],
    },
  ],
});


...