首页  >  文章  >  Java  >  如何在维护数据结构的同时删除 Firestore 中的集合或子集合?

如何在维护数据结构的同时删除 Firestore 中的集合或子集合?

DDD
DDD原创
2024-10-27 05:04:02777浏览

How to Delete a Collection or Subcollection in Firestore while Maintaining Data Structure?

删除 Firestore 中的集合或子集合

在 Firestore 中处理嵌套数据结构时,由于限制,删除集合可能会很棘手集合删除。本文提供了一种在维护数据结构的同时删除集合和子集合的解决方案。

在所呈现的场景中,有一个名为“列表”的集合,其中包含具有代表列表 ID 的 ID 的文档。每个列表文档都有两个子集合:“员工”和“位置”。删除特定列表需要小心处理,以避免孤立子集合。

删除过程

要成功删除特定列表,请按照以下步骤操作:

  1. 迭代“employees”子集合并删除每个文档。
  2. 迭代“locations”子集合并删除每个文档。
  3. 删除“listId”文档。

大型集合的批量删除

对于大型集合,建议批量删除文档,以避免内存错误。实现一个功能,批量删除 10 个文档,然后重复该过程,直到删除整个集合。

Firestore 安全影响

需要注意的是,Firebase团队建议不要删除集合。但是,对于小型集合和受信任的服务器环境,可以谨慎使用此方法。

Android 代码示例

对于 Android 应用程序,您可以使用以下内容删除集合的代码:

<code class="java">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();
}</code>

以上是如何在维护数据结构的同时删除 Firestore 中的集合或子集合?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn