Mongo / Mongoose 如何扩展 DBRef



假设有一个多人游戏是这样定义的:

    var GameSchema = new Schema({
      players : {type : [Schema.ObjectID], ref : 'User', required : true}
    });

我想知道存储每个用户的分数的最佳方式是什么,因为知道每个游戏都有自己的分数。以下是一些选项:

  1. 添加单独的属性数组

    var GameSchema = new Schema({
      players : {type : [Schema.ObjectID], ref : 'User', required : true}
     ,scores  : {type : [Number]}
    });
    

    创建关系的唯一方法是引用索引位置。似乎不是一个好主意。

  2. 添加播放器嵌入式文档

    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似乎也不对。

  3. 将 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,它将完全替换为查询结果。

相关内容

  • 没有找到相关文章

最新更新