【问题标题】:Firestore - replace collection documents while deleting if neededFirestore - 如果需要,在删除时替换集合文档
【发布时间】: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


    【解决方案1】:

    没有 Firestore API 可以用新内容替换整个集合。虽然您可以为它file a feature request,但我怀疑它会很快被添加,因为根据我的经验,这是一个非常罕见的 API 请求。

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

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

    听起来你已经在做#2了。如果您在完成这项工作时遇到问题并且无法使用 #1,如果您显示 minimal code that reproduces the problem,我们可能会更好地提供帮助。

    【讨论】:

    • 是的,由于您提到的原因,#1 不实用,还因为擦除数据和重写数据成本更高,在我的用例中它可能很重要。我做#2,但版本有点不同。我不喜欢自己做差异计算,而是让 firestore 来做。它适用于添加和更改文档,但不适用于删除。所以我自己只处理删除。我保留一个包含所有当前项目 ID 的数组的“元”文档。在我阅读的每次民意调查中,查看缺失的 ID,删除项目,并使用当前项目 ID 更新“元”文档。如果firestore为我这样做会很棒:)
    猜你喜欢
    • 2020-01-03
    • 2018-03-22
    • 1970-01-01
    • 2021-12-28
    • 2020-09-08
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多