假设有一个多人游戏定义如下:
var GameSchema = new Schema({
players : {type : [Schema.ObjectID], ref : 'User', required : true}
});
我想知道每个游戏都有自己的分数,最好的方法是为每个用户存储得分。以下是一些选项:
添加单独的属性数组
var GameSchema = new Schema({
players : {type : [Schema.ObjectID], ref : 'User', required : true}
,scores : {type : [Number]}
});
创建关系的唯一方法是引用索引位置。看起来不是一个好主意。
添加播放器嵌入式文档
var PlayerSchema = new Schema({
user : {type : [Schema.ObjectID], ref : 'User', required : true}
,score : {type : Number, default : 0 }
});
var GameSchema = new Schema({
players : {type : [PlayerSchema], required : true}
});
这种方法的主要问题是用户信息被深埋得更深。不得不打电话给game.players.user而不是game.players似乎也不对。
将DBRref扩展为嵌入式文档?
理想情况下,我应该能够做到
var PlayerSchema = new Schema({
_id : {type : [Schema.ObjectID], ref : 'User'}
,score : {type : Number, default : 0 }
});
var GameSchema = new Schema({
players : {type : [PlayerSchema], required : true}
});
这种方法基本上与#2类似,只是用户被直接引用为Player的id。我假设这个“地图”用户到玩家,这样就可以调用game.players [player_id] .score。不幸的是,上面的代码不起作用。
什么是最佳做法?还有其他选择吗?
谢谢!
答案 0 :(得分:1)
MongooseArrays上有一个id
方法可以提供帮助。这个gist是一个有效的例子。它更接近,但不是完全干净的b / c,_id需要保持分离。
当您填充字段时,您想要的内容(game.players[player_id].score
)实际上没有意义,它将完全替换为查询结果。