如何在Firestore中正确删除深度递归文档?

时间:2019-08-19 09:06:37

标签: firebase google-cloud-firestore

我有一个学生的根集合,该集合包含学生文档,并且每个文档都有一些子集合。例如:标记,每个标记文档又具有子集合,依此类推,直到深度4。

现在,如果我删除特定的标记子集合,我希望将其所有嵌套的子集合全部删除,而不是将其挂掉。

我阅读了以下开放github问题 https://github.com/firebase/firebase-admin-node/issues/361

并发现只有当我们知道collection是一个叶子子collection(达到最大深度)时,deepDeleteCollection才可以使用。但是要获取此信息,我们需要按该子集合中的每个文档分别进行查询,这在性能上没有意义。

实现deepCollectionDelete的最佳方法是什么? 请让我知道,以防万一我似乎错过这里。

谢谢。

1 个答案:

答案 0 :(得分:0)

  

但是要获取此信息,我们需要按该子集合中的每个文档分别进行查询,这在性能方面没有意义。

与在Firebase realtime database中删除特定节点内的整个结构不同,您本来需要引用并调用removeValue()方法,但在Cloud Firestore中这是不可能的。为了删除包含子集合的文档,该子集合就包含具有其他子集合的其他文档,您需要查找并删除子集合中所有从较深层次到较高层次的文档。例如,假设您有一个如下所示的架构:

Firestore-root
   |
   --- collectionOne
         |
         --- documentOne
         |      |
         |      --- subcollectionOne
         |              |
         |              --- documentTwo
         |                    |
         |                    --- subSubCollectionOne
         |                           |
         |                           --- //Documents
         |
         --- documentThree
                |
                --- subcollectionThree
                        |
                        --- // documents

假设要删除documentOne,则需要获取subSubCollectionOne内的所有文档并删除它们,然后找到subcollectionOne内的所有文档并删除它们,只有在最后才删除documentOne

  

这对性能没有意义。

这不是事实。删除集合和子集合中存在的文档的过程非常好。您可以以较小的块或使用Cloud Function删除客户端上的文档。