我对NodeJS和MongoDB非常陌生,我有三个Collection ,一个用于章节,一个用于讲座,一个用于assets资源 每门课程都有章节,每一章都有一系列的讲座,每一堂课都有assets资源 因此,我想通过CourseID获取章节,并在章节内部获取讲课,并在每一堂课中获取assets资源

课程:

const mongoose = require('mongoose');
var Double = require('@mongoosejs/double');

const courseSchema = new mongoose.Schema({
    title: {
        type: String,
        required: true,
    },
    requirements: {
        type: String,
    },
    
    code: {
        type: String,
        required: true,
    },
    coverPhoto: {
        type: String,
        required: false,
    },
    
    description: {
        type: String
    },

    instructor:{
        type:mongoose.Schema.Types.ObjectId,
        ref:'User',
        required:true
    },

    category:{
        type:mongoose.Schema.Types.ObjectId,
        ref:'Category',
        required:true
    },

    learns: [{
        type: String
    }],
    subCategory:{
        type:mongoose.Schema.Types.ObjectId,
        ref:'SubCategory',
        required:true
    },


    isCoaching: {
        type: Boolean,
        default: false,
    },

    isFree: {
        type: Boolean,
        default: false,
    },

    price: {
        type: Double,
        default: 0,
    },
    rating: {
        type: Double,
        default: 0,
    },
    isPublished: {
        type: Boolean,
        default: false,
    },

    dateCreated: {
        type:Date,
        default:Date.now,
    },
});

exports.Course = mongoose.model('Course', courseSchema);
exports.courseSchema = courseSchema;

第二章:

    const mongoose = require('mongoose');

    const chapterSchema = new mongoose.Schema({
        course:{
            type:mongoose.Schema.Types.ObjectId,
            ref:'Course',
            required:true
        },
        title: {
            type: String,
            required: true,
        },
        sort_order: {
            type: Number,
            default: 1,
        },
        is_published: {
            type: Boolean,
            default: true,
        },

    });
    exports.Chapter = mongoose.model('Chapter', chapterSchema);
    exports.chapterSchema = chapterSchema;

讲座:

const mongoose = require('mongoose');

const lectureSchema = new mongoose.Schema({
    chapter:{
        type:mongoose.Schema.Types.ObjectId,
        ref:'Chapter',
        required:true
    },

    title: {
        type: String,
        required: true,
    },
    sort_order: {
        type: Number,
        default: 1,
    },

    is_published: {
        type: Boolean,
        default: true,
    },


});

exports.Lecture = mongoose.model('Lecture', lectureSchema);
exports.lectureSchema = lectureSchema;

assets资源 :

const mongoose = require('mongoose');

const assetSchema = new mongoose.Schema({
    lecture:{
        type:mongoose.Schema.Types.ObjectId,
        ref:'Lecture',
        required:true
    },
    title: {
        type: String,
        required:true
    },
    asset_type: {
        type: String
    },
    description: {
        type: String,
        require:true
    },

    file_url: {
        type: String,
        require:true
    },
    page_number: {
        type: Number,
        default:1
    },
    time_estimation: {
        type: String,
        require:true
    },

    is_external: {
        type: Boolean,
        default: false,
    },

    is_published: {
        type: Boolean,
        default: true,
    },


});


exports.Asset = mongoose.model('Asset', assetSchema);
exports.assetSchema = assetSchema;

获取课程章节

router.get(`/`, async (req, res) => {
    let course_filter = {};
    if (req.query.course) {
        course_filter = {course:req.query.course};
    }
    const chapterList = await Chapter.find(course_filter).populate('lecture').sort('sort_order');
    if (!chapterList) {
        res.status(500).json({ success: false });
    }
    res.send(chapterList);
});

推荐答案

使用简单聚合:

const chapterList = await Chapter.aggregate([{
    $lookup: {
    from: 'lectures',
    localField: '_id',
    foreignField: 'chapter',
    as: 'lectures'
    }}]);

Node.js相关问答推荐

聚合发布/订阅消息

在Node JS中获取控制台选项卡标题

为什么这个verifyToken函数从未被调用过?

如何使用NodeJS在mongodb中更新文档

如果我加入另一个公会且我的​​机器人已在其中,欢迎消息发送错误

如何在 require 方法中使用路径与node.js react ?

动态设置元数据,无需重复请求 NextJS 13

无法通过 NextJS 访问 HTTP 帖子中的正文

我如何在 Raku 的供应中注册不同的事件?

图像存储在后端文件夹中,但使用 multer 和 react.js 在前端找不到

MERN 堆栈项目中的 React [create-react-app] 正在提供依赖项

GridFS 大文件下载使 Node.js 服务器崩溃. MongoServerError:排序超出了字节的内存限制

为什么我在生产环境中 deproy Next.js 示例项目时 CSS 不起作用?

提供静态文件到底是什么意思?

如何从 Redis 保存和检索会话

如何在 Node.js 中使用 chmod

使用 pg-promise 进行多行插入

Node.js 应用程序有周期性的缓慢和/或超时(不接受传入的请求)

Fluxible 中的脱水和再水合代表什么?

处理快速异步中间件中的错误