node.js - 如何查找用户已加入的所有课程?猫鼬
问题描述
我正在努力寻找用户加入的课程。我有这个课程模型架构
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,如何找到用户加入的课程?
解决方案
由于您没有从 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"
}
虚拟填充文档:
推荐阅读
- python - 从 bash 脚本调用的 Python 脚本不处理信号
- c++ - 是否可以将来自 Win32 EDIT 控件的文本输入存储在 C++ std::string 中?
- php - 如何按范围计算foreach循环
- c# - 使用多种身份验证方案进行授权
- php - 使用 DI PHP 在存储库中指定模型
- mysql - 试图将当前日期时间插入数据库但产生错误
- c - 如何将 1D char 转换为 2D int 数组并将其传递给 int C?
- android - 更改 android 应用中单个活动的状态栏颜色
- android - 如何从 SafeArgs 中的资源中获取默认字符串值?
- angular-material - 更新的材料设计 (mdc - 2018) 与角度 (dart) 组件