如何将Firestore的sub-collection迁移至Supabase并获取其数据?
处理Firestore子集合迁移到Supabase的方法
官方提供的collections.js脚本默认只遍历顶层集合,子集合的提取和迁移需要你自定义扩展脚本逻辑,具体可以这么做:
1. 修改脚本递归遍历子集合
在原脚本基础上添加递归逻辑,遍历每个文档下的子集合并导出数据:
// 递归遍历文档的子集合并导出数据 async function processDocumentSubcollections(docRef, parentCollectionName) { const subcollections = await docRef.listCollections(); for (const subcol of subcollections) { // 子集合文件名结合父层级命名,方便区分 const exportFileName = `${parentCollectionName}_${docRef.id}_${subcol.id}.json`; const docs = []; const snapshot = await subcol.get(); snapshot.forEach(doc => { docs.push({ id: doc.id, parent_doc_id: docRef.id, // 保留父文档ID用于后续关联 ...doc.data() }); }); // 将子集合数据写入JSON文件 fs.writeFileSync(exportFileName, JSON.stringify(docs, null, 2)); console.log(`导出子集合 ${subcol.id} 到 ${exportFileName}`); // 递归处理更深层级的子集合(如果存在) for (const subDoc of snapshot.docs) { await processDocumentSubcollections(subDoc.ref, `${parentCollectionName}_${docRef.id}_${subcol.id}`); } } } // 在原顶层集合遍历逻辑中调用递归函数 async function processTopLevelCollections() { const collections = await firestore.listCollections(); for (const col of collections) { const snapshot = await col.get(); // 先处理顶层集合数据(原脚本逻辑) // ... // 再遍历每个文档的子集合 for (const doc of snapshot.docs) { await processDocumentSubcollections(doc.ref, col.id); } } }
2. 将子集合映射为独立PostgreSQL表
- 每个子集合对应一张独立表,表名可以用
父集合名_子集合名的格式(比如users_orders),清晰体现关联关系。 - 表结构中保留
parent_doc_id字段,作为外键关联到父集合对应的表,维持数据关联性。 - 对于Firestore的嵌套字段,可根据查询需求选择拆分为关联表,或用PostgreSQL的
JSONB类型直接存储。
3. 导入子集合数据到Supabase
- 把导出的子集合JSON文件,通过Supabase Dashboard的「SQL编辑器」或
psql命令导入:-- 示例:创建users_orders表并导入数据 CREATE TABLE IF NOT EXISTS users_orders ( id TEXT PRIMARY KEY, parent_doc_id TEXT REFERENCES users(id), -- 关联父表users order_details JSONB -- 或拆分为具体字段如order_date, total_amount等 ); -- 本地使用psql导入(需确保文件路径正确) COPY users_orders FROM '/path/to/users_orders.json' WITH (FORMAT json);
注意事项
- Firestore文档ID为字符串类型,PostgreSQL中建议用
TEXT类型作为主键,避免类型转换问题。 - 若子集合层级极深,建议改用迭代方式遍历,避免递归栈溢出。
- 迁移前先在测试环境验证数据完整性,确保父文档与子集合的关联关系正确。
内容的提问来源于stack exchange,提问作者Hyejung
相关产品推荐
相关产品推荐

