簡體   English   中英

在兩個級別上使用貓鼬填充

[英]Using Mongoose populate on two levels

我正在制作一個電影網站,以發展我的MEAN-stack技能。 目前,我正嘗試從數據庫中獲取電影文檔。 該電影文檔具有一個屬性評論,該屬性評論是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);

我已經填充了從服務器獲取的電影對象的reviews屬性,但是我想知道如何也可以填充我獲得的每個評論對象的user屬性。 因此,我沒有看到objectId,而是看到了實際的用戶對象。

這就是我從服務器檢索到的電影對象的結構的樣子

我在服務器端的路線:我填充了評論屬性,但是我不知道如何在這些評論對象中填充user屬性

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
                });
            })
        })
});

我認為您可以使用.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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM