首页 > 解决方案 > 如何查找用户已加入的所有课程?猫鼬

问题描述

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

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,如何找到用户加入的课程?

标签: node.jsmongodbmongoose

解决方案


由于您没有从 User 模型到 Course 模型的任何引用,因此您需要使用虚拟填充。

用户型号:

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


推荐阅读