swift - 如何最大化 Cloud Firestore 中的现有数字字段
问题描述
我在一个文档中有几个字段,其中包含迷你游戏的用户记录。在用户玩了几个之后,我更新了这个文档中的记录。不能允许我用较小的记录值覆盖现有记录值。因此,我需要最大化它们。
我考虑过的解决方案:
- 交易。这个解决方案对我不起作用,因为没有 Internet 连接它就无法工作。
- 云函数。我可以在更新或创建文档时触发该功能。这个解决方案对我有用,但它使我的应用程序中的逻辑复杂化了很多。
- 安全规则。如果文档的新值小于旧值,我可以阻止文档被写入。但是这个解决方案只有在你一次写一个字段的情况下才能很好地工作。
理想情况下,我想要以下内容:
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
、、和。在协议的描述中,我找到了最大和最小方法,但我怀疑这是否可以合法使用。arrayUnion
arrayRemove
delete
谁能告诉我任何其他可行的方法?
升级版:
让以下文档存储在服务器上:
{ "game_id": 13 }
用户通过一台设备(离线)玩游戏并获得 20 分。
然后同一用户从另一台设备(在线)上玩相同的游戏并获得 22 分。发送更新请求。服务器现在存储以下信息:
{ "game_id": 22 }
在用户的第一台设备上,出现互联网并进行录制。在这种情况下,会发生覆盖并且文档采用以下形式:
{ "game_id": 20 }
即覆盖之前收集的用户记录。但是只有当新值大于当前值时,我才需要进行录制。也就是说,第二步之后的数据不应该改变。
解决方案
如果您不能使用交易(这通常是正确的做法),那么您必须使用其他方法之一。我不认为你有任何选择。您可能会更轻松地使用 Cloud Functions,而且我认为这不会像您说的那样使事情复杂化。只需几行代码即可检查任何更新的值不应小于现有值。
推荐阅读
- swift - 运行 Swift 代码所需的最小内存量是多少?
- r - R:我如何使用 R 的公式符号来紧凑地生成除选定的二次项子集之外的所有项?
- java - Java - 如何将输入字符串放入随机字母的二维数组中?
- python - Python 3.6:创建一个数据透视表,汇总数据框中多列的值计数
- python - 使用另一个 netcdf 文件在 netcdf 文件中填充 nan 值
- multithreading - 使用 var 参数的匿名线程过程
- r - 在 R 中使用收集制作多个条形图
- pointers - 在 Fortran 中的某个内存地址获取值
- python - 如何从 numpy 数组中删除两个最小的数字并计算中位数 python 3
- sql - 如何解决此查询