繁体   English   中英

猫鼬填充文档

[英]Mongoose populate documents

我用猫鼬得到了3个数据库模型,如下所示:

//profile.js
var ProfileSchema   = new Schema({
    username:    { type: String, required: true },                   
    password:    { type: String, required: true },                   
    matches:    [{ type: Schema.Types.ObjectId, ref: 'Match' }]
});

//match.js
var MatchSchema   = new Schema({ 
    scores:     [{ type: Schema.Types.ObjectId, ref: 'Score',  required: true }],
});

//score.js
var ScoreSchema   = new Schema({
    score:       {type: Number, required: true},
    achivement: [{type: String, required: true}],
});

我尝试用

Profile.findOne({ _id: mongoose.Types.ObjectId(profile_id) })
            .populate('matches')
            .populate('matches.scores')
            .exec(function(err, profile) {
                if (err) {...}
                if (profile) {
                   console.log(profile);
                }
            });

比赛被填充,但是我没有得到比赛中的分数。 猫鼬不支持此功能吗,还是我做错了什么? 填充给我这个:

{
    user_token: "539b07397c045fc00efc8b84"
    username: "username002"
    sex: 0
    country: "SE"
    friends: []
    -matches: [
        -{
            __v: 1
            _id: "539eddf9eac17bb8185b950c"
            -scores: [
                "539ee1c876f274701e17c068"
                "539ee1c876f274701e17c069"
                "539ee1c876f274701e17c06a"
            ]
        }
    ]
}

但是我想将比分数组填充到match数组中。 我可以这样做吗?

是的,你是对的。 我尝试使用链填充的我得到相同的输出。

对于您的查询,请使用async.js ,然后按照下面提到的方法进行填充。

有关更多详细信息,请查看此代码 根据您的查询,它是一个有效的,经过测试的示例代码。 请仔细阅读注释后的代码,以更好地理解下面的代码以及所提供片段的链接。

//Find the profile and populate all matches related to that profile
Profile.findOne({
    _id: mongoose.Types.ObjectId(profile_id)
})
.populate('matches')
.exec(function(err, profile) {
    if (err) throw err;

    //We got the profile and populated matches in Array Form
    if (profile) {
        // Now there are multiple Matches
        // We want to fetch score of each Match
        // for that particular profile

        // For each match related to that profile
        async.forEach(profile.matches, function(match) {
            console.log(match, 'match')
            // For each match related to that profile
            // Populate score achieved by that person
            Match.find({
                _id:match.id
            })
            .populate('scores', 'score')
            .exec(function (err, score) {
                if (err) throw err;

                // here is score of all the matches
                // played by the person whose profile id
                // is passed
                console.log(score);
            })
        })
    }
});
Profile.findOne({ _id: mongoose.Types.ObjectId(profile_id) })
        .populate('matches.scores')
        .exec(function(err, profile) {
            if (err) {...}
            if (profile) {
               console.log(profile);
            }
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM