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