【问题标题】:Mongo / Mongoose How to extend a DBRefMongo / Mongoose 如何扩展 DBRef
【发布时间】:2012-06-19 22:44:43
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: mongodb schema mongoose database-schema dbref


    【解决方案1】:

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

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

    【讨论】:

    • 所以我们不能避免重复_id和user._id...好吧。最重要的是,它有效!谢谢,亚伦。
    猜你喜欢
    • 2017-10-30
    • 2017-03-30
    • 1970-01-01
    • 2012-12-25
    • 2014-02-24
    • 2018-06-05
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多