【问题标题】:Find orphaned subcollection documents查找孤立的子集合文档
【发布时间】:2022-03-26 15:19:15
【问题描述】:

firestore 文档说:

当您删除具有关联子集合的文档时,子集合不会被删除。它们仍然可以通过参考访问。例如,即使db.collection('coll').doc('doc') 引用的文档不再存在,也可能存在db.collection('coll').doc('doc').collection('subcoll').doc('subdoc') 引用的文档。

如果您丢失了db.collection('coll').doc('doc') 的引用,是否有任何方法可以访问这些文档?例如,客户端 A 下线,然后创建 coll/doc/subcoll/foo。然后服务器删除coll/doc 和它的子集合。稍后客户端 A 重新联机并同步 foo。 看来现在我有办法知道 foo 存在并且正在浪费数据库中的空间。

【问题讨论】:

    标签: google-cloud-firestore


    【解决方案1】:

    可以访问这些文档。当用户删除文档时,将 ID 保存在某处。或者只是在 console.firebase.google.com 中找到文档 ID。如果您有已删除文档的 ID,您将能够获取子集合的文档。删除的文档 ID 在 Firebase 控制台中以斜体标记 (like this one)。

    【讨论】:

    【解决方案2】:

    应该可以用.collectionGroup('subcoll')检索子集合的所有文档(包括孤儿)。

    然后您可以使用.forEach() 遍历它们并使用.getParent() 检索它们的父级。

    如果他们没有父母,他们就是孤儿,你可以删除他们。

    【讨论】:

      【解决方案3】:

      在删除文档时添加云功能以删除子集合,可以帮助解决此问题再次发生。 https://firebase.google.com/docs/firestore/solutions/delete-collections#cloud_function

      exports.removeSubCollections = functions.firestore
      .document("col1/{docId}")
      .onWrite(async (change, context) => {
        const docId = context.params.docId;
      
        if(!change.after.exists) {
          //Delete all subcollections here
        }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        • 2021-04-08
        • 2018-12-07
        • 1970-01-01
        相关资源
        最近更新 更多