Firebase 项目之间的Firestore架构迁移

Firebase 项目之间的Firestore架构迁移,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我有一个Firebase项目,它基本上有两个环境:暂存和生产。我组织它们的方式是创建不同的Firebase项目。我的每个项目都使用和。除此之外,我还有与特定GIT分支相关的每个项目。这两个分支都集成到中的CI/CD管道中 因此,为了让它绝对清晰,我将分享一个简单的图表: 如您所见,我有源代码控制下的云函数的源代码,没有什么可担心的。当我遇到以下情况时,问题就会出现: 登台时出现Firestore架构更改 云功能(在登台时)根据新模式进行调整 将阶段性分支合并到生产中 由于生产上的旧Firest

我有一个Firebase项目,它基本上有两个环境:暂存生产。我组织它们的方式是创建不同的Firebase项目。我的每个项目都使用。除此之外,我还有与特定GIT分支相关的每个项目。这两个分支都集成到中的CI/CD管道中

因此,为了让它绝对清晰,我将分享一个简单的图表:

如您所见,我有源代码控制下的云函数的源代码,没有什么可担心的。当我遇到以下情况时,问题就会出现:

  • 登台时出现Firestore架构更改
  • 云功能(在登台时)根据新模式进行调整
  • 阶段性分支合并到生产中
  • 由于生产上的旧Firestore模式,那里的新功能无法按预期工作
  • 为了解决这个问题,我需要手动转到生产Firestore实例,并调整那里的模式(有可能弄乱生产数据)

    在完美的情况下,我将使该操作自动化,现有的项目数据将被调整为合并后动态引入的新模式


    这有可能吗?类似于。

    云Firestore是无模式的—文档没有强制模式。代码可以在任何时候编写它想要的任何字段。(对于web和移动客户端,这是由安全规则控制的,但对于后端代码,没有限制。)因此,云Firestore中没有正式迁移


    文档的“模式”由读写这些文档的代码有效地定义。这意味着将数据迁移到新格式意味着您必须编写代码来执行所需的更改。这真的没有简单的办法。您真正能做的就是设计更新,以便在将现有代码移动到另一个环境时不会中断现有代码。这意味着您的代码应该能够适应中断更改,或者在所有代码更新以处理这些更改之前不要执行中断更改。

    您必须使用谷歌云下载Firestore数据的存档。自己在存档上运行迁移脚本,然后上载存档以恢复Firestore数据库

    Google Cloud为您提供了大量的命令行访问权限,用于管理Firestore服务

    // manage indexes
    gcloud firestore indexes
    
    // export all data to a bucket
    gcloud firestore export gs://[BUCKET_NAME]
    
    // import data from a bucket
    gcloud firestore import gs://[BUCKET_NAME]/[filename]
    
    // manage admin "functions" currently running (i.e. kill long processes)
    gcloud firestore operations
    
    从Google Cloud Bucket下载/上传JSON归档文件

    // list files in a bucket
    gsutil ls gs://[BUCKET_NAME]
    
    // download
    gsutil cp gs://[BUCKET_NAME]/[filename] .
    
    // upload
    gsutil cp [filename] gs://[BUCKET_NAME]/[filename]
    
    一旦您将Google Cloud设置为可从构建脚本访问。可以自动化数据迁移脚本以下载、转换和上载数据

    建议在Firestore中维护一个“迁移”文档,以便跟踪需要执行的迁移恢复

    为了避免繁重的迁移任务,请尝试向文档添加“version”属性,然后使用查询生成器上的转换器回调将数据转换为“客户端”上的最新模式。虽然这不会帮助您处理Firestore规则或函数的更改。通常更容易做出一些微小的改变,而这些改变大多是装饰性的