仅保存已修改的字段

时间:2015-06-06 13:40:27

标签: mongodb data-consistency

我正在开发一款游戏,玩家根据游戏世界中的位置在服务器之间切换,以保持单一服务器的幻觉,同时保持可扩展性。当玩家加入服务器时,他们的数据从数据库(MongoDB)加载,当他们退出或更改服务器时,他们的数据将被保存。

我的问题来自于玩家数据从玩家需要偶尔发生的单独服务器修改的情况。数据库中的数据已更改,但当播放器离开或更改服务器时,数据将被覆盖: Example Image

为了解决这个问题,我想只存储修改过的数据,因为通常你想要的数据是最近更改过的。然而,当试图找到这样做的方法时,我注意到缺少这样做的情况。是否有任何充分的理由不这样做并使用另一种方法来确保修改后的数据不会被覆盖?我能想到的唯一问题是数据一致性,其中字段被更新,只有部分字段被覆盖,可能会使播放器处于无效状态,通过一起更新所有相关字段可以相当容易地避免这种情况。

如果有任何其他原因反对仅坚持选择一个对象或任何其他方法来解决这个问题而不引入任何重大问题,我很乐意听到它们。

1 个答案:

答案 0 :(得分:2)

这是数据库和代码之间潜在状态变化的典型示例。

在玩家个人资料/数据文档中添加一个整数;叫它v。让我们假设v = 6。

当玩家加入时,服务器会加载记录。服务器知道它的“本地”数据视图是v = 6.当玩家离开时,代码将调用

findAndModify({query: {"userID":"ID1","v":6}, update: {"$inc": { v: 1}, "$set": { fldtochange: newval, anotherfldtochange: newval2  } } });

为简单起见,我们在这里显示文字6,但它将是在服务器加载期间填充的变量。仅当v = 6的原始值完好无损时,此命令才会成功。如果有人更改了它,则不会进行更新。您可以采用各种路径进行恢复,包括重新读取数据并对本地服务器中的状态执行增量操作。如果v = 6仍然存在,则原子递增+1(例如7),其余字段用新值设置。