Android Studio 我如何删除一个文档及其所有子集合在firebase与flutter和dart

ffvjumwh  于 2022-11-16  发布在  Android
关注(0)|答案(2)|浏览(116)

每次我尝试使用documentSnapshot.delete()以编程方式删除文档时,firebase只删除文档而不删除它的子集合。我想通过按下按钮永久删除文档及其所有子集合,而每次用户尝试创建同一文档时,它都是空的。
正确的做法是什么?

(已关闭)

下面是对我有效的代码:

CollectionReference<Map<String, dynamic>> collectionReference = FirebaseFirestore.instance.collection('collection name').doc('document name').collection('collection name');
DocumentReference<Map<String, dynamic>> documentReference = collectionReference.doc('document name');

documentReference.collection('lists').get().then((lists) {
    lists.docs.forEach((listElement) {
      documentReference.collection('lists').doc(listElement.id.toString()).collection('cards').get().then((cards) {
        cards.docs.forEach((cardElement) {
          documentReference.collection('lists').doc(listElement.id.toString()).collection('cards').doc(cardElement.id.toString()).delete();
        });
      });
      documentReference.collection('lists').doc(listElement.id.toString()).delete();
    });
  });

await documentReference.delete();
w6lpcovy

w6lpcovy1#

删除document不会自动删除其子集合中的所有文档。
firestore API中没有随文档沿着删除子集合的方法,需要循环并删除子集合中的文档,然后删除父document
这里有一个链接,以便更好地理解。

7kqas0il

7kqas0il2#

我不知道Dart,但下面是我使用PHPFirestore的简单解决方案;

public function destroyCollection(CollectionReference $collection)
{
    $documents = [];
    foreach ($collection->listDocuments() as $document) {
        $documents[] = $document;
    }

    $this->destroyDocuments($documents);
}

/**
 * @param DocumentReference[] $documents
 */
public function destroyDocuments(array $documents)
{
    if (!$documents) return;
    
    $batch = $this->database->getBatch();
    foreach ($documents as $document) {
        $batch->delete($document);

        foreach ($document->collections() as $collection) {
            $this->destroyCollection($collection);
        }
    }
    
    $batch->commit();
}

它会删除所有找到的文档,不管它们嵌套得有多深。不存在的文档不会在快照和查询中显示,所以这就是为什么我使用listDocuments()方法,尽管我牺牲了一点性能。

相关问题