【问题标题】:How to delete all documents in Cloud Firestore except one?如何删除 Cloud Firestore 中除一个之外的所有文档?
【发布时间】:2021-03-09 12:02:12
【问题描述】:

我在 Flutter 应用中使用 Cloud Firestore。我想删除 TestApp/Dashboard 下的所有文档,除了 ID 与今天日期匹配的文档。假设今天的日期是 2020 年 12 月 12 日。我知道可以删除所有文档,但我没有找到任何关于删除所有文档的信息。

我的 Cloud Firestore 数据库

- TestApp
  - Dashboard
    - 2020/12/12
      - totalDailyVisitors: 12
    - 2020/12/11
      - totalDailyVisitors: 34
    - 2020/12/10
      - totalDailyVisitors: 56

如何删除除 2020/12/12 之外的所有 ID 文档?

【问题讨论】:

  • Firestore 没有批量删除功能。您必须查询要删除的文档,迭代查询结果,然后单独删除每个文档。如果您试图删除除一个以外的所有内容,您可以简单地阅读整个集合,并跳过删除应该保留的一个文档。
  • 我明白了。这与Shri Hari's answer 非常相似

标签: flutter dart google-cloud-firestore


【解决方案1】:

据我了解你的问题,我想给你一个想法。

我认为不可能删除例外。但是我们可以利用批处理操作。

正如this issue 中提到的,像这样为 Flutter 制作它,

WriteBatch _batch = FirebaseFirestore.instance.batch();

QuerySnapshot _query = await FirebaseFirestore.instance.collection('Dashboard').getDocuments();

_query.documents.forEach((doc) {
     if(doc.documentID != 'YOUR DATE'){
         _batch.delete(doc.ref);
     }
});

await _batch.commit();

正如问题中提到的,它也有一些限制!

参考:https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes

【讨论】:

  • 这是对我的问题最有帮助的答案。谢谢你的解释!
【解决方案2】:

您可以先获取所需的文档,然后将其从文档的删除中排除。例如:

refUser.where("date", != "2020/12/12").getDocuments().then((snapshot){
    snapshot.documents.first.reference.delete();
});

首先备份您的文件,因为我不确定这是否有效!!! 编辑:将日期更改为需要的日期。 (不确定是否需要 ID 所以我用 date 占位符更改了它)

【讨论】:

  • 它不起作用,因为 where() 需要类型字段的参数,我需要根据 documentID 删除除一个以外的所有参数
猜你喜欢
  • 2018-06-18
  • 2021-10-16
  • 2020-12-11
  • 2019-02-15
  • 2018-08-02
  • 2018-03-22
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
相关资源
最近更新 更多