将集合(及其中包含的所有内容)移动到另一个 Firebase 项目

问题描述 投票:0回答:1

似乎这个问题已经以多种不同的方式被问过(最有希望的是这篇文章这个。 然而,它们要么超出了我目前对谷歌服务的熟悉程度,要么以我不确定这是同一个问题的方式制定。因为我无法想象自己是唯一一个必须这样做的人,所以问题是:

我有两个 Firestore 项目:

  1. 一个用于发展。
  2. 一个给我的用户。

有一个包含文档、包含集合的集合...我在开发项目中工作,现在感觉已经准备好转移到其他项目了。

如何才能做到这一点?

(我无法想象,等待手工制作的数据集的改进版本没有错误后再将其提供给用户是一种罕见的情况。)

这是我到目前为止所做的:

  • 使用导入/导出功能:
    1. 在开发项目中创建了一个存储桶,创建了一个存储桶并在那里导出了集合(全部使用 Google 的 UI,而不是命令行)
    2. 切换项目,转到 Google Cloud 存储选项卡,创建一个存储桶。
    3. 单击存储桶,然后按“传输数据”,然后按“传输数据”。
    4. 在对话框中找到开发项目,找到导出的集合,选择它并将其移动到存储桶中。将所有选项保留为默认值并开始工作。
    5. 返回 Firebase 界面,让它将我发送到 Google Cloud Firebase(为什么访问起来这么麻烦?),然后从存储桶中导入所需的集合(出于某种原因,我必须调整名称才能使其正常工作)。
    6. 最后,我可以在我的项目 firestore 数据库中看到该集合。
    7. 我很高兴。直到我发现所有的子集都不见了!
  • 使用 CLI 尝试了一些事情,但没有成功。
  • 在两个项目中都启用了 BigQuery,但发现它令人困惑。
  • 尝试安装“Firefoo”,它声称可以做到这一点,但安装程序已损坏。
  • 由于子集合和包含它们的文档在出口时也被移动的不确定性,我已经放弃了。

那么正确的做法是什么? (或者您是否不打算将开发项目中某些数据的工作转移到准备就绪后将其转移到生产环境?)

为什么看起来这么复杂?

firebase google-cloud-firestore
1个回答
0
投票

我编写了以下脚本来“解决”我的问题。这些是我的具体步骤:

如果您希望 dev 中的集合(及其包含的数据)替换其他项目中相应的集合,请按照这些操作。

  1. 在我的项目文件夹中,我创建了新文件夹
    movedata
    ,在其中创建了两个附加文件夹:
    source
    destination
  2. 在 dev firebase 项目中,在“项目设置”>“服务帐户”中。我生成一个新的私钥(这会下载一个文件),并将其放入
    source
    文件夹中。
  3. 在另一个 Firebase 项目中,我重复步骤 2,只是将文件放入
    destination
    文件夹中。
  4. 我在步骤 1 的文件夹
    movedata
    中创建了一个名为
    move_firestore_collection.js
    的文件,我在其中放置了以下脚本(如果您想使用它,请使用您的集合设置
    COLLECTION_NAME
    变量)。

const admin = require('firebase-admin');
const serviceAccountSource = require('./source/serviceAccountKey.json');
const serviceAccountTarget = require('./target/serviceAccountKey.json');

//Replace 'your-collection-id' with your actual collection.
const COLLECTION_NAME = 'your-collection-id';

// Initialize Firebase Admin SDK for source project
const sourceApp = admin.initializeApp({
  credential: admin.credential.cert(serviceAccountSource),
}, 'sourceApp');

// Initialize Firebase Admin SDK for target project
const targetApp = admin.initializeApp({
  credential: admin.credential.cert(serviceAccountTarget),
}, 'targetApp');

const sourceFirestore = sourceApp.firestore();
const targetFirestore = targetApp.firestore();

async function copyCollection(sourceFirestore, targetFirestore, collectionPath) {
  const collectionRef = sourceFirestore.collection(collectionPath);
  const snapshot = await collectionRef.get();

  for (const doc of snapshot.docs) {
    const docData = doc.data();
    await targetFirestore.collection(collectionPath).doc(doc.id).set(docData);

    // Recursively copy subcollections
    const subcollections = await doc.ref.listCollections();
    for (const subcollection of subcollections) {
      await copyCollection(sourceFirestore, targetFirestore, `${collectionPath}/${doc.id}/${subcollection.id}`);
    }
  }
}

async function main() {
  try {
    console.log(`Starting to copy collection ${COLLECTION_NAME}`);
    await copyCollection(sourceFirestore, targetFirestore, COLLECTION_NAME);
    console.log(`Successfully copied collection ${COLLECTION_NAME}`);
  } catch (error) {
    console.error('Error copying collection:', error);
  } finally {
    sourceApp.delete();
    targetApp.delete();
  }
}

main();

  1. 运行
    node movedata/move_firestore_collection.js
    ,你就应该设置好了。来自 dev 的集合和嵌套数据将替换来自其他项目的数据。如果这不起作用,请尝试先运行
    npm install firebase-admin
    ,然后重新运行脚本。

可能有更好/更聪明的方法来做到这一点,但这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.