Mongo / Mongoose如何扩展DBRef

时间:2012-06-17 21:09:33

标签: mongodb schema mongoose database-schema 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。不幸的是,上面的代码不起作用。

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

    谢谢!

1 个答案:

答案 0 :(得分:1)

MongooseArrays上有一个id方法可以提供帮助。这个gist是一个有效的例子。它更接近,但不是完全干净的b / c,_id需要保持分离。

当您填充字段时,您想要的内容(game.players[player_id].score)实际上没有意义,它将完全替换为查询结果。