遗嘱填充refs

时间:2018-01-06 15:53:47

标签: node.js mongodb express mongoose

我试图保存并检索与相关游戏相关的游戏匹配集合,以及在其中玩过的游戏。我的架构看起来像这样,

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: Mixedgames更改为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%。

1 个答案:

答案 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本身没有播放器列表。