获取 firestore 中已删除文档的 ID

Get IDs of deleted documents in firestore

我有一个包含数千个文档的大集合。这些文档有子集合,里面有文档。现在最高层的文件我删了很多

结构: MyCollection => MyDocument => MySubcollection => MySubdocument

现在我意识到,文件已删除(未在任何查询中显示)但子集合及其文档仍然存在。现在我也不确定如何删除它们,因为我不知道已删除文档的 ID。

当我试图通过向我的集合发送查询以读取所有文档来找出 ID 时,已删除的文档(按设计)不再包括在内。那么我现在如何找出他们的 ID 来删除他们的子集合?

感谢任何建议!

这完全取决于您的确切目标。

如果要删除ALLMyCollection集合中的文档,包括ALL[=38]中的文档=]ALL 子集合,您可以通过以下命令使用 Firebase CLI:

firebase firestore:delete MyCollection -r

执行firebase firestore:delete --help以获得更多选项。

当然,这只能由您的 Firebase 项目的所有者完成。


如果你想让其他用户从前端做同样的事情(即所有文档,包括所有子集合),你可以使用文档 "Delete data with a Callable Cloud Function" section 中详细介绍了技术。

如本文档中所述:

You can take advantage of the firestore:delete command in the Firebase Command Line Interface (CLI). You can import any function of the Firebase CLI into your Node.js application using the firebase-tools package.

The Firebase CLI uses the Cloud Firestore REST API to find all documents under the specified path and delete them individually. This implementation requires no knowledge of your app's specific data hierarchy and will even find and delete "orphaned" documents that no longer have a parent.


如果只想删除MyCollection集合中文档的一个子集连同子集合中的文档,可以使用相同的方法如上,带有文件路径,例如:

firestore:delete MyCollection/MyDocument -r

最后,如果您的问题是您已经删除了“父”文档并且您不知道如何删除(孤儿)子集合中的文档(因为您不知道父),您可以使用集合组查询来查询所有 MySubcollection 子集合并检测父文档是否存在。 JavaScript 中的以下代码可以解决问题。

  const db = firebase.firestore();
  const parentDocReferences = [];
  const deletedParentDocIds = [];

  db.collectionGroup('MySubcollection')
    .get()
    .then((querySnapshot) => {
      querySnapshot.forEach((doc) => {
        console.log(doc.id);
        console.log(doc.ref.parent.parent.path);
        parentDocReferences.push(db.doc(doc.ref.parent.parent.path).get());
      });
      return Promise.all(parentDocReferences);
    })
    .then((docSnapshots) => {
      docSnapshots.forEach((doc) => {
        console.log(doc.id);
        console.log(doc.exists);
        if (!doc.exists && deletedParentDocIds.indexOf(doc.id) === -1) {
          deletedParentDocIds.push(doc.id);
        }
      });
      
      // Use the deletedParentDocIds array
      // For example, get all orphan subcollections reference in order to delete all the documents in those collections (see https://firebase.google.com/docs/firestore/manage-data/delete-data#collections)
      deletedParentDocIds.forEach(docId => {
         
        const orphanSubCollectionRef = db.collection(`MyCollection/${docId}/MySubcollection`);
        // ...
        
      });
      
    });