首页 > 解决方案 > 如何最大化 Cloud Firestore 中的现有数字字段

问题描述

我在一个文档中有几个字段,其中包含迷你游戏的用户记录。在用户玩了几个之后,我更新了这个文档中的记录。不能允许我用较小的记录值覆盖现有记录值。因此,我需要最大化它们。

我考虑过的解决方案:

  1. 交易。这个解决方案对我不起作用,因为没有 Internet 连接它就无法工作。
  2. 云函数。我可以在更新或创建文档时触发该功能。这个解决方案对我有用,但它使我的应用程序中的逻辑复杂化了很多。
  3. 安全规则。如果文档的新值小于旧值,我可以阻止文档被写入。但是这个解决方案只有在你一次写一个字段的情况下才能很好地工作。

理想情况下,我想要以下内容:

let data: [String: Any] = [
    "game_id0": FieldValue.maximum(newRecord0),
    "game_id1": FieldValue.maximum(newRecord1),
    "game_id2": FieldValue.maximum(newRecord2),
]
let docRef = db.collection("user_records").document(documentId)
docRef.setData(data, merge: true)

但不幸的是,FieldValue类只有方法:increment、、和。在协议的描述中,我找到了最大和最小方法,但我怀疑这是否可以合法使用。arrayUnionarrayRemovedelete

谁能告诉我任何其他可行的方法?

升级版:

让以下文档存储在服务器上:

{ "game_id": 13 }

用户通过一台设备(离线)玩游戏并获得 20 分。

然后同一用户从另一台设备(在线)上玩相同的游戏并获得 22 分。发送更新请求。服务器现在存储以下信息:

{ "game_id": 22 }

在用户的第一台设备上,出现互联网并进行录制。在这种情况下,会发生覆盖并且文档采用以下形式:

{ "game_id": 20 }

即覆盖之前收集的用户记录。但是只有当新值大于当前值时,我才需要进行录制。也就是说,第二步之后的数据不应该改变。

标签: swiftfirebasegoogle-cloud-firestore

解决方案


如果您不能使用交易(这通常是正确的做法),那么您必须使用其他方法之一。我不认为你有任何选择。您可能会更轻松地使用 Cloud Functions,而且我认为这不会像您说的那样使事情复杂化。只需几行代码即可检查任何更新的值不应小于现有值。


推荐阅读