只保存修改过的字段

Saving only modified fields

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

我的问题是从与播放器不同的服务器修改播放器数据的情况引起的,这种情况偶尔会发生。数据库中的数据已更改,但当玩家离开或更改服务器时,数据将被覆盖:

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

如果有任何其他原因反对只坚持选择一个对象或任何其他方法来解决这个问题,但不会引入任何主要问题,我很乐意听到他们。

这是数据库和代码之间底层状态变化的经典示例。

在您的播放器 profile/data 文档中添加一个整数;称它为 v。假设 v = 6.

当玩家加入时,服务器加载记录。服务器知道它的 "local" 查看数据是 v = 6。当玩家离开时,代码将调用

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

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