假设有一个多人游戏定义如下:
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。不幸的是,上面的代码不起作用。
什么是最佳做法?还有其他选择吗?
谢谢!