【问题标题】:Using Mongoose populate on two levels在两个级别上使用 Mongoose 填充
【发布时间】:2018-07-19 09:32:21
【问题描述】:

我正在制作一个电影网站来培养我的 MEAN-stack 技能。目前我正试图从我的数据库中获取一个电影文档。该电影文档有一个属性 reviews,它是一个 ObjectId 数组,引用了 Review 模型。我填充了这些对象 ID,每个 Review 文档都具有以下结构:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var schema = new Schema({
    user: {type: Schema.Types.ObjectId, ref:'User'},
    movie: {type: Schema.Types.ObjectId, ref:'Movie'},
    date: {type: Date, default: Date.now},
    content: String
}, { usePushEach: true });

module.exports = mongoose.model('Review', schema);

我已经填充了从服务器获取的电影对象的评论属性,但我想知道如何还填充我获得的每个评论对象的用户属性。因此,我不会看到 objectId,而是看到实际的用户对象。

我在服务器端的路由:我填充了评论属性,但我不知道如何在这些评论对象中填充用户属性

router.get('/getmovie/:id', function(req, res, next) {
        var id = req.params.id;

    Movie.findById(id, function(err, movie){
            if (err) {
                res.status(500).json({
                    message: "An error occurred",
                    obj: err
                })
            }
            Review.populate(movie, {path: 'reviews'}, function(err, movie){
                if (err) {
                    res.status(500).json({
                        message: "An error occurred",
                        obj: err
                    })
                }
                res.status(200).json({
                    Message: "success",
                    obj: movie
                });
            })
        })
});

【问题讨论】:

    标签: javascript node.js mongoose


    【解决方案1】:

    我认为您可以使用.populate() 来简化您的代码。

    Movie.findById(id).populate({
        path: 'reviews',
        populate: {
            path: 'user'
        }
    }).exec(function(err, movie){
        if (err) {
            // make sure you add return or else the code will continue
            return res.status(500).json({
                message: "An error occurred",
                obj: err
            })
        }
        res.status(200).json({
            Message: "success",
            obj: movie
        });
    });
    

    请注意,您最多只能完成 2 个级别。否则,您将需要使用更复杂的.aggregate()

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2021-10-11
      • 2017-02-10
      • 2015-08-07
      • 1970-01-01
      • 2018-06-08
      • 2017-12-11
      • 2020-10-17
      • 2016-07-04
      相关资源
      最近更新 更多