【问题标题】:Get request only returns _id of nested elements and not full elements from mongodb获取请求仅返回嵌套元素的 _id 而不是来自 mongodb 的完整元素
【发布时间】:2016-06-05 14:33:33
【问题描述】:

我正在构建我的第一个平均堆栈应用程序,但在配置所有路由和取回我想要的数据时遇到了麻烦。

我有两个模型。

课程:

var CourseSchema = new mongoose.Schema({
    code: String,
    name: String,
    courseContentGrade: Number,
    courseTeachingGrade: Number,
    courseAverage: Number,
    reviews: [{ type: mongoose.Schema.Types.ObjectId, refs: 'review'}]
});

和审查:

var ReviewSchema = new mongoose.Schema({
    contentReview: String,
    teachingReview: String,
    contentGrade: Number,
    teachingGrade: Number,
    average: Number,
    professor: String,
    trimester: {
        type: String,
        enum: ['T1', 'T2', 'T3']
    },
    day: {
        type: String,
        enum: ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi']
    },
    time: {
        type: String,
        enum: ['9h-12h', '13h15-16h15', '16h30-19h30']
    },
    round: {
        type: String,
        enum: ['1', '2', '3']
    },
    bet: Number,
    year: Number,
    upvotes: {type: Number, default: 0},
    author: String,
    course: { type: mongoose.Schema.Types.ObjectId, ref:'Course'}
});

我已经设置了能够获取所有课程并获得特定课程的所有评论的路线。当我使用 curl 获取特定课程的评论时 (localhost:3000/courses{course.id}) 我只能返回 [] 但是当我使用 curl 获取所有课程时 (localhost:3000/courses/{course.id}/reviews) 我会返回所有课程以及我拥有的每门课程: "reviews":["review.id","review2.id"]。当我卷曲特定评论 (localhost:3000/reviews/{review.id}) 时,我得到了评论对象。

到目前为止,我已经配置了这些路线:

router.get('/courses', function(req, res, next) {
  Course.find(function(err, courses){
    if(err){ return next(err); }

    res.json(courses);
  });
});

router.get('/reviews/:review', function (req, res) {
    res.json(req.review);
});

router.get('/courses/:course', function (req, res) {
    res.json(req.course);
});

router.get('/courses/:course/reviews', function (req, res){
    res.json(req.course.reviews);
});

我使用这些参数:

router.param('review', function (req, res, next, id) {
    var query = Review.findById(id);

    query.exec(function (err, review){
        if(err) { return next(err);}
        if(!review) {return next(new Error('can\'t find review'));}

        req.review = review;
        return next();
    });
});

router.param('course', function (req, res, next, id) {
    var query = Course.findById(id).populate('reviews');

    query.exec(function (err, course){
        if(err) { return next(err);}
        if(!course) {return next(new Error('can\'t find course'));}

        req.course = course;
        return next();
    });
});

编辑:

该问题的解决方案是填充函数(见下文),除此之外,我在课程中引用它时使用“review”作为模型的名称而不是“review”(注意 R/r ) 当我在课程中有一个 s 时,我没有在这一点上提出任何错误....不知道为什么。

【问题讨论】:

    标签: node.js mean


    【解决方案1】:

    您需要更改以下路线以包含填充功能:

    Router.get('/courses', function(req, res, next) {
        Course.find().populate('reviews').exec(function(err, courses){
            if(err){ return next(err); }
    
            res.json(courses);
        });
    });
    

    写在手机上,如有错误请见谅!

    【讨论】:

    • 嗨,感谢您的宝贵时间(再次!)。当我使用该解决方案时,它并不能解决我的问题,并且当我只使用 /courses 路线时,评论的 ID 从课程中消失了。我会研究那个填充函数,这对我来说已经是个问题了。
    • 我不明白,我查看了其他项目的代码,他们都成功使用了填充。我注意到我的项目和其他项目之间的区别是架构定义:我有:var CourseSchema = new mongoose.Schema({ code: String, name: String, courseContentGrade: Number, courseTeachingGrade: Number, courseAverage: Number, reviews: [{ type: mongoose.Schema.Types.ObjectId, refs: 'review'}] }); 虽然他们在ref 没有 s。但是当我把它取下来时,我得到了一个错误
    • 难以置信。我将审查模型命名为“审查”,但在我的课程架构中引用了“审查”。在 ref 使用 s 时,我没有问题,当我不使用它时,我有一个错误,并且在 Review 时没有注意到 de R/r。我不知道为什么 s 阻止了错误...
    猜你喜欢
    • 2016-06-04
    • 2020-07-08
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多