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

ALE*_*ANO 3 firebase flutter google-cloud-firestore

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

cloud_firestore:^ 0.7.4 firebase_storage:^ 1.0.1

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

Firestore.instance.collection('messages').delete();
Run Code Online (Sandbox Code Playgroud)

但是删除没有定义

正确的语法如何?

Cop*_*oad 35

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();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于大量文档(使用WriteBatch):

    final instance = FirebaseFirestore.instance;
    final batch = instance.batch();
    var collection = instance.collection('collection');
    var snapshots = await collection.get();
    for (var doc in snapshots.docs) {
      batch.delete(doc.reference);
    }
    await batch.commit();
    
    Run Code Online (Sandbox Code Playgroud)

感谢@Chris提出批量写入的想法。

  • 这应该是正确的答案。它在 2022 年 7 月对我有用。 (3认同)

Jos*_*han 9

如 Firestore文档中所述,目前没有原子删除集合的操作。

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

firestore.collection('messages').getDocuments().then((snapshot) {
  for (DocumentSnapshot doc in snapshot.documents) {
    doc.reference.delete();
  });
});
Run Code Online (Sandbox Code Playgroud)

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


Rya*_*ell 8

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

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

  • 我意识到我的回答含糊不清,但我可以根据经验告诉您,在处理期货时使用 *map* 将无法正常工作。使用 *for* 循环已经解决了我目前遇到的所有问题。 (2认同)

Chr*_*ner 6

真的很惊讶没有人建议批量这些删除请求。

\n

一批写入以原子方式完成,并且可以写入多个文档。批量写入是完全原子的,与事务不同,它们不依赖于写入的文档修改。即使设备处于离线状态,批量写入也能正常工作。

\n

一个好的解决方案是这样的:

\n
Future<void> deleteAll() async {\n  final collection = await FirebaseFirestore.instance\n      .collection("posts")\n      .get();\n\n  final batch = FirebaseFirestore.instance.batch();\n\n  for (final doc in collection.docs) {\n    batch.delete(doc.reference);\n  }\n  \n  return batch.commit();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请记住,您delete也可以与其他任务结合起来。collection如何用一组新数据替换 a 中的所有内容的示例:

\n
Future<void> replaceAll(List<Posts> newPosts) async {\n  final collection = await FirebaseFirestore.instance\n      .collection("posts")\n      .get();\n\n  final batch = FirebaseFirestore.instance.batch();\n\n  for (final doc in collection.docs) {\n    batch.delete(doc.reference);\n  }\n\n  for (final post in posts) {\n    batch.set(postRef().doc(post.id), post);\n  }\n\n  batch.commit();\n}\n
Run Code Online (Sandbox Code Playgroud)\n