Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongoose 嵌套模式引用嵌套模式作为真理源_Mongoose_Mongoose Schema_Nosql - Fatal编程技术网

Mongoose 嵌套模式引用嵌套模式作为真理源

Mongoose 嵌套模式引用嵌套模式作为真理源,mongoose,mongoose-schema,nosql,Mongoose,Mongoose Schema,Nosql,我想知道如何最好地解决以下结构/场景,其中我们有一个嵌套的模式作为真理的来源,并希望引用它 模式: 游戏 较量 带有选择[]的票证 注意:我省略了大多数不必要的字段 游戏 var gameSchema = new Schema({ dateTime: Date, location: String, homeTeam: String, awayTeam: String }); 竞赛 var contestSchema = new Schema({ sc

我想知道如何最好地解决以下结构/场景,其中我们有一个嵌套的模式作为真理的来源,并希望引用它

模式:

  • 游戏
  • 较量
  • 带有
    选择[]的票证
注意:我省略了大多数不必要的字段

游戏

var gameSchema = new Schema({
    dateTime: Date,
    location: String,
    homeTeam: String,
    awayTeam: String
});
竞赛

var contestSchema = new Schema({
    schedule: [{
        week: Number,
        games: [gameSchema],
    }]
});
带有
选择[]的票证

var pickSchema = new Schema({
    week: Number,
    team: String,
    game: {
        type: Schema.Types.ObjectId,
        ref: 'Game'
    }
});

var ticketSchema = new Schema({
    contest: {
        type: Schema.Types.ObjectId,
        ref: 'Contest'
    },
    picks: [pickSchema]
});
以下是我解决这个问题的几个想法:

游戏模式作为自己的集合

我们可以将
游戏
移动到它自己的集合中,然后简单地引用
竞赛
票证中的游戏。选择
,就像这样
{type:Schema.Types.ObjectId,ref:'game'}

然而,如果我相信我在查找
竞赛
时总是需要
游戏
,如果我理解正确,我们会希望在
竞赛
中留下真相的来源

跳过ref,只保存游戏的ObjectId

对于这一个,我们需要稍微重写我们的
PickSchema

var pickSchema = new Schema({
    week: Number,
    team: String,
    game_id: Schema.Types.ObjectId
});
请注意,我们指的是
票子上的
竞赛
。这应该允许我们在
票证
中为游戏构建类似的内容。(未测试,只是概念)

我的意思是,我们可以通过把上面的内容放到一个过滤器里来美化它,但最终,这看起来就像一场噩梦

我们可能能够在
populate('contest')
中运行查询,但经过一些尝试后,我认为这不会提供我们所需要的

重复游戏

考虑到游戏变化的情况相对较低。(例如,NFL比赛时间多久变化一次)我们可以简单地将整个比赛放入
竞赛
挑选
。这意味着,如果游戏确实发生了变化,我们必须编写一些相当繁重的函数来更新每个对象,但鉴于我们预计这种情况会非常少,这可能是一个可接受的解决方案。然而,如果有一个更好的解决方案,只有一个真相来源,我宁愿坚持下去

来结束这一部分

目前,我倾向于将
游戏
转移到它自己的收藏中,并全面引用它,这将确保一个单一的真相来源

Ticket.findById(ticketObjectId).populate('contest').exec((err, tickets) => {
    let ticket = tickets[0];
    let pickedGame;

    for(pick of ticket.picks) {

        for(schedule of tickets.contest.schedule){

            if(schedule.week === pick.week) {

                for(game of schedule.games) {

                    if(game._id === pick.game_id) {
                        pickedGame = game; // Yay we found our game
                    }

                }

            }

        }

    }
});