【问题标题】:how to Query Firestore for a field added at a later date如何查询 Firestore 以获取以后添加的字段
【发布时间】:2021-02-01 19:19:02
【问题描述】:

假设我想为 firestore 中的每条记录添加一个新字段,例如。 isArchived: boolean

但是,数据库已经在生产中了!这带来了最大的问题:

您不能查询像 where('isArchived', '!=', true) 这样的文档,因为这将不包括没有新字段 isArchived 的文档。

添加新字段的策略

  • 首先更新数据库中的所有文档并添加新字段
  • 然后可以查询where('isArchived', '!=', true)

剩下的问题

当一些客户端没有更新到我的应用程序的最新版本时,他们仍然会添加没有新字段的文档。所以新版本的搜索逻辑还是会漏掉文档。

解决剩下的问题

还添加了一个云功能,可在添加新记录时检查缺失的字段。

但是新的问题是:

  • 这将花费我每写入一条记录的双倍费用
  • 很难知道何时可以弃用此云功能

请求建议

我觉得以后一定有更好的方法可以将新字段添加到记录中。 (使用 SQL 可以迁移并设置默认值?)

谁能给我一个比我目前使用的非常糟糕的解决方法更好的解决方案?

【问题讨论】:

    标签: google-cloud-firestore


    【解决方案1】:

    Firestore 不像许多 SQL 数据库那样具有迁移功能,因此没有类似的路径可供您选择。

    像这样处理文档版本控制的最佳方法是发送所有读取和写入文档的代码,以观察每个文档中的文档版本字段。您将使用此版本来确定已迁移和未迁移的单个文档。当然,如果您没有文档版本字段,添加一个会引入您在此处描述的相同问题。

    唯一可行的解​​决方法是使用Cloud Functions Firestore trigger 获取一个回调,该回调在将文档添加到数据库时在 Google Cloud 中运行,并查看文档中的字段以确定是否需要更改以及如何更改。因此,如果客户端未能写入isArchived 字段,该函数可以简单地重写文档以添加它。在你部署了这个函数并且它工作正常之后,你可以运行代码来迁移所有没有这个字段的现有文档。

    如果您对文档进行版本控制,那么将来迁移会变得更加容易,因为现在您有了一个明确的值来过滤任何未来需要了解每个文档中应该包含什么内容的触发器或代码。

    【讨论】:

    • 非常感谢您的建议!你认为将来有可能查询给定字段具有void 的文档吗? (换句话说,查询例如where('newField', '==', void 0) 以获取没有该字段的文档)
    • 不,void 不是有效的字段值。
    • 您认为将来会有办法查询缺少指定字段的文档吗?不管这样的语法看起来如何。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多