如何使用Flutter删除Firestore中集合中的所有文档

时间:2018-10-31 18:02:42

标签: firebase flutter google-cloud-firestore

我有一个Firestore数据库。我的项目插件:

cloud_firestore:^ 0.7.4   firebase_storage:^ 1.0.1

这有一个包含多个文档的“邮件”集合。 我需要删除邮件集中的所有文档。但是此代码失败:

Firestore.instance.collection('messages').delete();

但删除未定义

正确的语法如何?

9 个答案:

答案 0 :(得分:5)

啊。第一个答案是几乎是正确的。该问题与dart中的map方法及其与Futures的工作方式有关。无论如何,尝试像这样使用for循环,您应该会很好:

firestore.collection('messages').getDocuments().then((snapshot) {
  for (DocumentSnapshot ds in snapshot.documents){
    ds.reference.delete();
  });
});

答案 1 :(得分:1)

如Firestore docs中所述,目前没有可自动删除集合的操作。

您需要获取所有文档,并遍历它们以删除每个文档。

firestore.collection('messages').getDocuments().then((snapshot) {
  return snapshot.documents.map((doc) {
    doc.reference.delete();
  });
});

请注意,这只会删除messages集合。如果此路径中有子集合,它们将保留在Firestore中。该文档还具有云功能,还与可调用功能集成在一起,该功能使用Firebase命令行界面来帮助处理嵌套删除。

答案 2 :(得分:1)

2021 年更新:

迭代 QueryDocumentSnapshot,获取 DocumentReference 并对其调用 delete

var collection = FirebaseFirestore.instance.collection('collection');
var snapshots = await collection.get();
for (var doc in snapshots.docs) {
  await doc.reference.delete();
}

答案 3 :(得分:0)

删除之所以不起作用,是因为该功能是删除文档而不是集合,因此不使用:

Firestore.instance.collection('messages').delete();

使用此:

 Firestore.instance.collection('messages').document(documentID).delete();

答案 4 :(得分:0)

一个一个地删除Firestore集合中的所有文档:

db.collection("users").document(userID).collection("cart")
    .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {                                  
                db.collection("users").document(userID).
                    collection("cart").document(document.getId()).delete();
            }
        } else {
        }
    }
});

答案 5 :(得分:0)

我认为这可能对任何参考文献中的多个馆藏都有帮助

// add ${documentReference} that contains / may contains the ${collectionsList}
_recursiveDeleteDocumentNestedCollections(
      DocumentReference documentReference, List<String> collectionsList) async {
    // check if collection list length > 0
    if (collectionsList.length > 0) {
      // this line provide an async forEach and wait until it finished
      Future.forEach(collectionsList, (collectionName) async {
        // get the collection reference inside the provided document
        var nfCollectionRef = documentReference.collection(collectionName);
        try {
          // get nested collection documents
          var nestedDocuemtnsQuery = await nfCollectionRef.getDocuments();
          // loop through collection documents 
          Future.forEach(nestedDocuemtnsQuery.documents, (DocumentSnapshot doc) async {
            // recursive this function till the last nested collections documents
            _recursiveDeleteDocumentNestedCollections(
                doc.reference, collectionsList);
            // delete the main document
            doc.reference.delete();
          });
        } catch (e) {
          print('====================================');
          print(e);
          print('====================================');
        }
      });
    }
  }

答案 6 :(得分:0)

在最新版本的firebase中,您可以执行以下操作。

_collectionReference.snapshots().forEach((element) {
        for (QueryDocumentSnapshot snapshot in element.docs) {
          snapshot.reference.delete();
        }
      });

答案 7 :(得分:0)

以防万一,如果您不想使用流(因为它会一直删除,直到您取消订阅)。您可以继续删除。这是片段:

final collectionRef = FirebaseFirestore.instance.collection('collection_name');
final futureQuery = collectionRef.get();
await futureQuery.then((value) => value.docs.forEach((element) {
      element.reference.delete();
}));

答案 8 :(得分:0)

Firestore.instance.collection("chatRoom").document(chatRoomId).collection("chats").getDocuments().then((value) {
      for(var data in value.docs){
        Firestore.instance.collection("chatRoom").document(chatRoomId).collection("chats")
            .document(data.documentID).delete().then((value) {
          Firestore.instance.collection("chatRoom").document(chatRoomId).delete();

        });
      }
    });