0

假设有一个多人游戏定义如下:

    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。不幸的是,上面的代码不起作用。

什么是最佳做法?还有其他选择吗?

谢谢!

4

1 回答 1

1

MongooseArrays 上有一种id方法可以提供帮助。这个要点是一个工作示例。它更接近,虽然不是完全干净的 b/c _id 需要保持分开。

当您填充字段时,您想要的 ( game.players[player_id].score) 并没有真正意义 b/c,它将完全替换为查询结果。

于 2012-06-19T17:35:22.400 回答