如何查找用户已加入的所有课程?猫鼬

我正在努力寻找用户已加入的课程。 我有这个课程模型模式

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);

我有用户的ID,如何找到用户已加入的课程?

yzp0754 回答:如何查找用户已加入的所有课程?猫鼬

由于从用户模型到课程模型没有任何引用,因此需要使用虚拟填充。

用户模型:

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",{
                    "_id": "5dc84911b1f1bd0b20358143","user": "5dc84876b1f1bd0b2035813b"
                }
            ],{
            "_id": "5dc84969b1f1bd0b20358145","code": "Course 3 code","joined": [
                {
                    "_id": "5dc84969b1f1bd0b20358149",{
                    "_id": "5dc84969b1f1bd0b20358148",{
                    "_id": "5dc84969b1f1bd0b20358147","user": "5dc8487fb1f1bd0b2035813c"
                },{
                    "_id": "5dc84969b1f1bd0b20358146","user": "5dc84888b1f1bd0b2035813d"
                }
            ],"__v": 0
        }
    ],"id": "5dc84862b1f1bd0b2035813a"
}

虚拟填充文档:

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

本文链接:https://www.f2er.com/3128536.html

大家都在问