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

标签 java android firebase google-cloud-firestore

我有一个名为列表的集合,它有 ID 代表列表 ID 的文档。该文档有一个名为 employees 的集合和另一个名为 locations 的集合。

结构如下:

(lists)
    -listId
       (employees)
       (locations)

如果用户想要删除特定列表,那么问题是我们无法删除 listId,因为这将保留集合(正如 Firestore 文档中提到的)。

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

有什么推荐吗?

最佳答案

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

  1. 查找 employees 集合下的所有文档并将其删除
  2. 查找 locations 集合下的所有文档并将其删除
  3. 删除listId文档

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

即使 Firebase 团队不推荐删除操作,因为它会对安全性和性能产生负面影响,您仍然可以执行此操作,但仅限于小型集合。如果您需要删除整个网络集合,请仅从受信任的服务器环境中执行此操作。

对于 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();
}

关于java - 如何从 Firestore 中删除集合或子集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49125183/

相关文章:

android - 在 contactList 中检测新的联系人添加

android - 在 Android 上实现 Google Play 应用静默安装功能

java - Firebase (Android) - 将过滤后的数据加载到自定义 ArrayList 中

firebase - 用户属性可以是 Google Analytics 中的数组吗?

java - Java使用jsonpath从另一个Json创建一个新的Json读取

java - 无效的 double : "" when calling EditText,,但在相同方法中未从其他人处获得

java - 在 Kotlin 中与 @RequestParam 一起使用时,自定义 HashMap 类的参数类型不匹配

android - ListView 中的 textview.setText() 导致强制关闭

javascript - 创建用户时将数据写入 Firestore 不起作用

java - 使用 JSF 获取异常的 Spring Web 流程配置