【问题标题】:How to recursively delete collection in firestore?如何递归删除firestore中的集合?
【发布时间】:2021-05-06 20:13:28
【问题描述】:

我需要一种方法来快速清除整个 Firestore 数据库,但找不到很好的文档来说明如何做到这一点。最终,我在堆栈溢出时发现了这个答案(Clear Firestore database of all data?),但对于清除整个数据库中数百万个文档需要多长时间有点紧张,所以我想要一种方法来一次递归地删除一个集合。

背景:我一直在运行一些测试,将大量数据从旧数据库迁移到 firestore,每次运行后,我都希望在 firestore 中使用干净的状态。不要在生产数据上使用它!

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    现在通过recursiveDelete 函数记录了这一点:

    请注意,这是一项相对较新的功能,因此您需要确保您的 Firebase 库已更新。

    // Setup
    const admin = require('firebase-admin');
    const serviceAccount = require("./files/my-file.json");
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount)
    });
    const firestore = admin.firestore();
    
    // Delete
    const documentRef = firestore
          .collection("users")
          .doc("M3S2iPhsiu2ZQmOK8ZcC");
    await firestore.recursiveDelete(documentRef);
    

    【讨论】:

    • 哇,这太美了。我希望这个问题和答案可以被推到 S.O. 的顶部。用于删除子集合。我觉得这里 98% 的答案仍然解释了批量删除子集合中的单个文档的过于繁琐的过程。对我来说工作得又快又漂亮。
    • 即使 Firebase 文档仍然说您必须自己递归遍历您的文档/集合。
    【解决方案2】:

    我可以通过运行 firestore cli delete 命令并通过路径指定每个集合来做到这一点。确保路径不要以斜杠开头,否则它会认为您指的是计算机上的目录。运行示例:

    firebase firestore:delete "path/to/collection" --recursive
    

    firestore:delete 命令也记录在这里:https://firebase.google.com/docs/firestore/manage-data/delete-data#delete_data_with_the_firebase_cli

    更新 请注意,删除大约 20000 个文档后,该命令可能会失败。我认为这可能是它达到的极限。我只是使用相同的集合路径重新运行几次,以完全删除大于 20k 文档的集合。

    【讨论】:

      【解决方案3】:

      来自 Fireship 网站:https://fireship.io/snippets/delete-firestore-collection/ 有 2 个选项可以删除 firestore 中的集合:

      选项 1: 您可以从 Firebase 控制台或使用 CLI 手动删除集合或子集合:

      firebase firestore:delete path-to-delete

      选项 2:

      可以通过 Cloud Function 与 Firebase 工具进行交互。这对 Callable 函数特别有效,因为您肯定希望强制执行某种形式的用户授权。 首先,获取 CI 令牌以对 firebase 工具进行身份验证。

      cd functions
      npm i firebase-tools -D
      
      firebase login:ci
      # your_token
      
      firebase functions:config:set ci_token='your_token'
      

      该函数应验证用户是否有权运行该操作。如果允许,它会在集合及其嵌套的子集合上递归运行 CLI 命令。

      const project = process.env.GCLOUD_PROJECT;
      const token = functions.config().ci_token;
      
      exports.deleteCollection = functions.runWith({ timeoutSeconds: 540})
        .https.onCall((data, context) => {
      
        const path = data.path;
        const allowed = context.auth.uid === path.split('/')[0]; // TODO your own logic
      
      if (!allowed) {
        throw new functions.https.HttpsError(
          'permission-denied',
          'Hey, that is not cool buddy!'
        );
      }
      
      return firebase_tools.firestore
        .delete(path, {
          project,
          token,
          recursive: true,
          yes: true,
        })
        .then(() => ({ result: 'all done!' }));
      });
      

      【讨论】:

      • 这是专门以管理员身份运行此命令的。 Firebase 控制台对于删除大型集合非常慢,所以我不建议这样做。云函数具有运行时和资源限制,因此我也不建议将它们用于非常大的集合。
      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多