假设有一个多人游戏是这样定义的:
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。不幸的是,上面的代码不起作用。
什么是最佳实践?还有其他选择吗?
谢谢!
MongooseArrays上有一个id
方法可以提供帮助。这个要点是一个工作示例。它更近,虽然不是很干净,但_id需要保持独立。
你想要的(game.players[player_id].score
)在填充字段时没有真正的意义b/c,它将完全替换为查询结果。