【发布时间】:2019-12-29 22:30:25
【问题描述】:
以下是对 Firestore 问题的简要描述:
我的集合中有项目文档。
ItemsCollection
ItemDoc1
someField1: someValue
someField2: someValue
ItemDoc2
someField1: someValue
someField2: someValue
ItemDoc3
someField1: someValue
someField2: someValue
现在,我从每隔几秒轮询一次的某个 API 获取更新的项目列表,并且在每次轮询时,我都想将项目的更新状态写入 Firestore。
例如初始API调用返回
[
ItemDoc1
someField1: someValue
someField2: someValue
ItemDoc2
someField1: someValue
someField2: someValue
ItemDoc3
someField1: someValue
someField2: someValue
]
所以当它被写入 Firestore 时,Firestore 的状态就是我上面写的那个。
现在,几秒钟后,进行了新的 API 调用,响应为
[
ItemDoc1
someField1: someValue
someField2: someValue
ItemDoc2
someField1: *differentValue*
someField2: someValue
]
我需要的是,在写入 Firestore 时,会发生以下情况:
- ItemDoc1 根本不会被写入,因为它没有改变
- ItemDoc2 将被识别为已更改并将更新
- ItemDoc3 将被删除,因为它在新响应中丢失
我找不到编写这种代码的好方法。
到目前为止,我尝试的是: 我创建了一个批处理,并为 API 响应中的每个项目创建了一个 doc ref,并将一个 set 命令添加到批处理中。实际上,由于批次限制为 500 个项目,而且我可能有更多,我将文档拆分为 500 个项目的块,然后为每个块创建一个单独的批次,然后并行运行所有批次。 结果 - 未更改的项目不会被重写,而更改的项目会按预期进行更新。但是,丢失的项目 (ItemDoc3) 不会被删除,因为到目前为止我只执行了 set 命令。为了识别删除,我必须单独保留当前的item id,每次收到新的API响应时,我都要自己计算删除了什么,并调用delete。
这一切都非常麻烦。是否有一些很好的方法来设置整个集合,以便我可以开箱即用地获得我需要的行为?我认为这在 Firestore 中是微不足道的
【问题讨论】:
标签: firebase google-cloud-firestore