You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:24:54