如何从 Firestore 中删除集合或子集合?

Posted

技术标签:

【中文标题】如何从 Firestore 中删除集合或子集合?【英文标题】:How delete a collection or subcollection from Firestore? 【发布时间】:2021-08-27 03:13:39 【问题描述】:

我有一个名为列表的集合,其中包含 ID 代表列表 ID 的文档。此文档有一个名为 employees 的集合和另一个名为 locations 的集合。

结构如下:

(lists)
    -listId
       (employees)
       (locations)

如果用户想要删除特定列表,那么问题是我们无法删除 listId,因为这样会保留集合(如 Firestore 文档所述)。

如何对结构进行建模以满足需求?我似乎无法绕过对子集合的需求。

有什么推荐吗?

【问题讨论】:

【参考方案1】:

无需重组数据库即可删除某些集合。要删除 Cloud Firestore 中的整个集合或子集合,请检索集合或子集合中的所有文档并将其删除。因此,要删除特定列表,请使用以下步骤:

    找到employees集合下的所有文档并删除它们 找到locations集合下的所有文档并删除它们 删除listId文档

如果您有较大的集合,您可能希望以较小的批次删除文档以避免内存不足错误。重复该过程,直到您删除整个集合或子集合。

即使 Firebase 团队不推荐删除操作,因为它has negative security and performance implications,您仍然可以执行此操作,但仅限于小型集合。如果您需要删除整个网络集合,请仅从受信任的服务器环境中执行此操作。

对于android,您可以使用以下代码:

private void deleteCollection(final CollectionReference collection, Executor executor) 
    Tasks.call(executor, () -> 
        int batchSize = 10;
        Query query = collection.orderBy(FieldPath.documentId()).limit(batchSize);
        List<DocumentSnapshot> deleted = deleteQueryBatch(query);

        while (deleted.size() >= batchSize) 
            DocumentSnapshot last = deleted.get(deleted.size() - 1);
            query = collection.orderBy(FieldPath.documentId()).startAfter(last.getId()).limit(batchSize);

            deleted = deleteQueryBatch(query);
        

        return null;
    );


@WorkerThread
private List<DocumentSnapshot> deleteQueryBatch(final Query query) throws Exception 
    QuerySnapshot querySnapshot = Tasks.await(query.get());

    WriteBatch batch = query.getFirestore().batch();
    for (DocumentSnapshot snapshot : querySnapshot) 
        batch.delete(snapshot.getReference());
    
    Tasks.await(batch.commit());

    return querySnapshot.getDocuments();

【讨论】:

嗯,我明白了。所以我想以这种方式一一删除是可以的。感谢您提供代码 sn-p,我现在正在尝试剖析它:) 能否请您解释一下如何使用上面提到的Executor? @Ben 嘿,Ben。一般而言,与其他概念相关的问题应单独添加。因此,请发布一个新问题,以便我和其他 Firebase 开发人员可以为您提供帮助。

以上是关于如何从 Firestore 中删除集合或子集合?的主要内容,如果未能解决你的问题,请参考以下文章

在 Firestore 中删除包含所有子集合和嵌套子集合的文档

Firestore:如何同时收听集合和子集合

如何从 Firestore 获取子集合数据

如何使用 Flutter 获取 Firestore 中每个集合的子集合

FireStore 文档如何在子集合中读取计算

如何将集合和子集合一起从 firestore 导出到 excel 或 bigquery 表?