【问题标题】:Populating Mongoose interconnected Models填充 Mongoose 互连模型
【发布时间】:2014-11-27 23:17:25
【问题描述】:

我已经尝试解决这个问题大约 4 个小时了,但我找不到解决它的方法。我有 3 个模型,看起来像这样:

第一个是我的锦标赛模型:

var tournamentSchema = mongoose.Schema({
tournamentName: String,
nrOfPlayers: String,
players: [{
  type: mongoose.Schema.Types.ObjectId, ref: "User" }],
openForLeagues: {
    "leagues" : []
},
organizer: [{
  type: mongoose.Schema.Types.ObjectId, ref: "User"
}]
});

第二个是我的用户模型:

var userSchema = mongoose.Schema({

local : {
nickname: String,
battlenetid: String,
email: String,
password: String,
race: String,
league: String,
role: String,
website: String,
avatarImage: String,
tournaments: [{
   type: mongoose.Schema.Types.ObjectId, ref: "Tournament"
}],
avatar: [{
  type: mongoose.Schema.Types.ObjectId, ref: "Avatar"
}]
}
});

第三个是我的头像模型:

var avatarSchema = mongoose.Schema({
 imageName: String,
 imageRaceCategory: String,
 imagePath: String
});

我要做的是根据它的 id 找到一个锦标赛,然后填充玩家数组以及参加这个锦标赛的每个玩家的头像。但是,当我尝试为玩家显示头像时,我变得不确定。

这是我的查询的样子:

Tournament.findById(req.params._id).populate('players organizer    players.local.avatar').exec( function(err, tournament){
  if(err){
    res.send(err)
  }else{
helperFunctions.getUserDetails(req.params.userId, function(user){
                        res.render('tournament/tournament-details.ejs',{
                            user: req.user,
                            tournament: tournament,
                            userAvatar: user,
                            moment: moment,
                            enlistedInTournament: enlistedInTournament,
                            eligibleForTournament: eligibleForTournament,
                            allPlacesTaken: allPlacesTaken,
                            procentajOcupare: (tournament.players.length * (100 / tournament.nrOfPlayers))
                        });
            });
  }
});

这就是我在视图中显示它的方式:

<%tournament.players.forEach(function(player){%>
<img src="<%=player.local.avatar.imagePath + '/' + player.local.avatar.imageName"%>/>
                        <li>
                            <%= player.local.nickname + ', ' + player.local.race + ', ' + player.local.league%>, <a href="/profile-details/<%= player._id%>">Profil jucator</a>
                        </li>
                    <%});%>

但是,我没有为 avatar.imagePath 和 avatar.imageName 定义,其他一切正常。有一个更好的方法吗?我错过了什么/做错了什么?提前谢谢!

【问题讨论】:

    标签: node.js express mongoose ejs


    【解决方案1】:

    "您可以调用 'populate' 来轻松地将 ObjectID 解析为关联的对象,但不能调用 'populate' 来解析包含在该对象中的 ObjectID。此外,由于填充的对象在技术上不是文档,你不能调用你附加到模式的任何函数。虽然这绝对是一个严重的限制,但通常可以通过使用嵌套模式来避免"

    请参阅https://thecodebarbarian.wordpress.com/2013/06/06/61/ 以获取解决您问题的替代方案

    【讨论】:

      【解决方案2】:

      您遇到这个问题是因为路径 players.local.avatar 没有被填充。对于子填充,您需要遍历 tournament.players 并在其中填充 local 字段。

      【讨论】:

        猜你喜欢
        • 2013-12-24
        • 2020-05-21
        • 2015-06-09
        • 2018-06-08
        • 1970-01-01
        • 2017-03-29
        • 1970-01-01
        • 2012-01-22
        • 2013-10-17
        相关资源
        最近更新 更多