Firestore-替换收集文档,同时根据需要删除

时间:2019-08-25 12:15:32

标签: firebase google-cloud-firestore

以下是我与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响应中的每个项目创建了一个文档引用,并向该批处理添加了一个 set 命令。实际上,由于批次限制为500个项目,而且我可能拥有更多,所以我将文档拆分为500个项目的块,然后为每个块创建一个单独的批次,然后并行运行所有批次。 结果-未更改的项目不会被重写,更改的项目将按预期进行更新。但是,丢失的项目(ItemDoc3)不会被删除,因为到目前为止我只执行过 set 命令。为了识别删除,我必须单独保存当前的项目ID,并且每次收到新的API响应时,我都要计算自己删除的内容,然后调用 delete

这非常麻烦。是否有一些不错的方法来设置整个集合,以便我可以立即获得所需的行为?我认为在Firestore中这是微不足道的

1 个答案:

答案 0 :(得分:1)

没有Firestore API可以用新内容替换整个集合。尽管您可以file a feature request这样做,但我怀疑它会在任何时候立即添加,因为根据我的经验这是一个非常不常见的API请求。

我看到两种实现您的用例的常用方法:

  1. 擦除所有现有内容,然后写入从API获取的所有数据。这在代码上将相对简单,但是意味着在两个步骤之间,数据库将为空。您可能不希望这样的空状态,因为实时侦听器可能会看到/显示它。
  2. 加载现有内容,遍历该内容,并为您需要执行的所有更新建立内部状态。完成循环后,将更新作为一组批处理写入或事务发送到Firestore。

听起来您已经在做#2。如果您在进行这项工作时遇到麻烦,而不能使用#1,那么如果显示minimal code that reproduces the problem,我们可能会更好地为您提供帮助。