似乎这个问题已经以多种不同的方式被问过(最有希望的是这篇文章和这个。 然而,它们要么超出了我目前对谷歌服务的熟悉程度,要么以我不确定这是同一个问题的方式制定。因为我无法想象自己是唯一一个必须这样做的人,所以问题是:
我有两个 Firestore 项目:
- 一个用于发展。
- 一个给我的用户。
有一个包含文档、包含集合的集合...我在开发项目中工作,现在感觉已经准备好转移到其他项目了。
如何才能做到这一点?
(我无法想象,等待手工制作的数据集的改进版本没有错误后再将其提供给用户是一种罕见的情况。)
这是我到目前为止所做的:
那么正确的做法是什么? (或者您是否不打算将开发项目中某些数据的工作转移到准备就绪后将其转移到生产环境?)
为什么看起来这么复杂?
我编写了以下脚本来“解决”我的问题。这些是我的具体步骤:
如果您希望 dev 中的集合(及其包含的数据)替换其他项目中相应的集合,请按照这些操作。
movedata
,在其中创建了两个附加文件夹:source
和 destination
。source
文件夹中。destination
文件夹中。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();
node movedata/move_firestore_collection.js
,你就应该设置好了。来自 dev 的集合和嵌套数据将替换来自其他项目的数据。如果这不起作用,请尝试先运行 npm install firebase-admin
,然后重新运行脚本。可能有更好/更聪明的方法来做到这一点,但这对我有用。