2014-10-02 5 views
0

Я пытался решить эту проблему около 4 часов, и я не могу найти способ ее решить. У меня есть 3 модели, которые выглядят следующим образом:Запутывание Mongoose взаимосвязано Модели

1-ый один мой турнир модель:

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

2-я одна моя модель Пользователь:

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

Что я пытаюсь сделать, это найти турнир, основанный на его идентификатор, а затем заполнить игрока массив, а также аватар для каждого игрока, участвующего в этом турнире. Тем не менее, я получаю undefined, когда я пытаюсь отображать аватары для игроков.

Это как мой запрос выглядит следующим образом:

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 и аватар. imageName, все остальное отлично работает. Есть лучший способ сделать это? Что я пропущу/делаю неправильно? Заранее спасибо!

ответ

1

«вы можете вызвать« заполнить », чтобы легко разрешить ObjectID в связанном объекте, но вы не можете вызвать« заполнять », чтобы разрешить ObjectID, содержащийся в этом объекте. Кроме того, поскольку заполненный объект не является технически Документ, вы не можете вызывать любые функции, которые прикреплены к схеме. Хотя это, безусловно, серьезное ограничение, часто можно избежать за счет использования вложенных схем»

Пожалуйста, обратитесь к https://thecodebarbarian.wordpress.com/2013/06/06/61/ альтернативы, чтобы решить вашу проблему

+0

Спасибо, Витор! – war81

0

Вы получаете эту проблему, потому что путь players.local.avatar не заполняется. Для субзаполнения вам необходимо пройти через tournament.players и заполнить поле local.

Смежные вопросы