我试图保存并检索与相关游戏相关的游戏匹配集合,以及在其中玩过的游戏。我的架构看起来像这样,
const TournamentSchema = new mongoose.Schema({
matches: [{
games: [{
type: mongoose.Schema.Types.Mixed,
ref: 'Game',
players: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Player',
}],
}],
}],
});
这就是数据库中的对象,
{
"__v": 0,
"_id": "5a50ed6b267ddd32c4523327",
"matches": [
{
"_id": "5a50ed6b267ddd32c4523328",
"games": [
{
"players": [
{ "_id": "5a4fa908d9d55465ac4fdbe6" },
{ "_id": "5a50cf3d09176c2bb0f98fe1" }
],
"_id": "5a498918ffc6220edbe8a403"
},
{
"players": [
{ "_id": "5a50cf5609176c2bb0f98fe2" },
{ "_id": "5a50cf6009176c2bb0f98fe3" }
],
"_id": "5a50cf9007c2bb0c73f3783a"
}
]
}
],
}
我试图像这样检索它,
async function list(req, res, next) {
logger.log('info', 'Incoming request to retrieve all tournaments');
const tournaments = await Tournament.find().populate('matches.games.players');
return res.json(tournaments);
}
但是,我从数据库获得的内容与保存的内容相同。裁判没有得到解决。如果我将type: Mixed
从games
更改为type: ObjectId
,它将不会持续players
,但populate
将解析games
。我如何使用refs中的refs?
根据要求,这是Game
架构的样子,
const GameSchema = new mongoose.Schema({
name: {
type: String,
unique: true,
required: true,
lowercase: true,
},
scoring: {
type: Object,
required: true,
rank: {
first_place: Number,
second_place: Number,
third_place: Number,
},
},
max_num_players: Number,
min_num_players: Number,
}, { runSettersOnQuery: true });
每个Game
每个等级可以有不同的scoring
百分比。例如,对于反恐精英,如果你是第一名,你将得到100%的积分,第二个80%,第三个50%。然而,对于英雄联盟来说,第一名将是85%,第二名是60%,第三名是50%。
答案 0 :(得分:0)
我认为问题在于你的名字"游戏"游戏集合中的游戏定义和锦标赛游戏(实际上是游戏+玩家)。
我会写这样的架构(未经测试):
const TournamentSchema = new mongoose.Schema({
matches: [{
games: [{
game: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Game',
},
players: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Player',
}],
}],
}],
});
你会这样查询:
Tournament.find().populate('matches.games.game matches.games.players')
我仍然不清楚Game
架构包含什么以及为什么Game
本身没有播放器列表。