Как найти все курсы, к которым присоединился пользователь? Мангуста - PullRequest
0 голосов
/ 10 ноября 2019

Я изо всех сил пытаюсь найти курсы, к которым присоединился пользователь. У меня есть эта схема модели курса

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const CourseSchema = new mongoose.Schema({
    code:{
        type:String,
    },
    joined:[
        {
            user:{
                type:mongoose.Schema.Types.ObjectId,
                ref:'user'
            }
        }
    ]
})

module.exports = Course = mongoose.model('course',CourseSchema);

Схема пользователя:

const mongoose = require("mongoose");

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  }
});

module.exports = User = mongoose.model("user", UserSchema);

У меня есть идентификатор пользователя, как найти курсы, к которым присоединился пользователь?

1 Ответ

0 голосов
/ 10 ноября 2019

Поскольку у вас нет ссылки от модели пользователя на модель курса, вам необходимо использовать виртуальное заполнение.

модель пользователя:

const mongoose = require("mongoose");

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  }
},
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true }
  });

// Virtual populate
UserSchema.virtual('courses', {
  ref: 'course',
  foreignField: 'joined.user',
  localField: '_id'
});

module.exports = User = mongoose.model("user", UserSchema);

После этого вы можете использовать маршрутнапример, для заполнения курсов данного пользователя:

router.get("/user/:id/courses", async (req, res) => {

  try {

    let userCourses = await User.findById(req.params.id).populate({ path: "courses" });

    res.status(200).send(userCourses);

  } catch (err) {
    console.log(err);
    res.status(500).send(err);
  }
});

Результат будет примерно таким:

{
    "_id": "5dc84862b1f1bd0b2035813a",
    "name": "User 1 name",
    "email": "user1@gmail.com",
    "__v": 0,
    "courses": [
        {
            "_id": "5dc848f2b1f1bd0b2035813e",
            "code": "Course 1 code",
            "joined": [
                {
                    "_id": "5dc848f2b1f1bd0b20358141",
                    "user": "5dc84862b1f1bd0b2035813a"
                },
                {
                    "_id": "5dc848f2b1f1bd0b20358140",
                    "user": "5dc84876b1f1bd0b2035813b"
                },
                {
                    "_id": "5dc848f2b1f1bd0b2035813f",
                    "user": "5dc8487fb1f1bd0b2035813c"
                }
            ],
            "__v": 0
        },
        {
            "_id": "5dc84911b1f1bd0b20358142",
            "code": "Course 2 code",
            "joined": [
                {
                    "_id": "5dc84911b1f1bd0b20358144",
                    "user": "5dc84862b1f1bd0b2035813a"
                },
                {
                    "_id": "5dc84911b1f1bd0b20358143",
                    "user": "5dc84876b1f1bd0b2035813b"
                }
            ],
            "__v": 0
        },
        {
            "_id": "5dc84969b1f1bd0b20358145",
            "code": "Course 3 code",
            "joined": [
                {
                    "_id": "5dc84969b1f1bd0b20358149",
                    "user": "5dc84862b1f1bd0b2035813a"
                },
                {
                    "_id": "5dc84969b1f1bd0b20358148",
                    "user": "5dc84876b1f1bd0b2035813b"
                },
                {
                    "_id": "5dc84969b1f1bd0b20358147",
                    "user": "5dc8487fb1f1bd0b2035813c"
                },
                {
                    "_id": "5dc84969b1f1bd0b20358146",
                    "user": "5dc84888b1f1bd0b2035813d"
                }
            ],
            "__v": 0
        }
    ],
    "id": "5dc84862b1f1bd0b2035813a"
}

Виртуальные документы для заполнения:

https://mongoosejs.com/docs/populate.html#populate-virtuals

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