【问题标题】:How to delete multiple documents that have different ids in firestore? [duplicate]如何删除firestore中具有不同ID的多个文档? [复制]
【发布时间】:2018-09-08 16:50:27
【问题描述】:

我有多个具有不同 id 的文档,我需要实现一些方法将它们全部删除,我进行了搜索,所以我想我应该采用的方式是使用批处理。 所以我的数据库就是这样Image

所以我能够在这样的数组列表中获取我的文档的 ID。

[0Y5rfMK3duHBUTN9XsO5、2Q70mSjNxkAoUMDAJ8rz 等...]

和我的代码:

WriteBatch batch = db.batch();
DocumentReference myRef = db.collection("Collection").document(String.valueOf(idsList));
batch.delete(myRef);
batch.commit();

但这不起作用,所以如果有一点遗漏的步骤,或者如果有任何其他方法可以执行它,将不胜感激写下来。

【问题讨论】:

    标签: android google-cloud-firestore


    【解决方案1】:

    您将不得不迭代您的列表并为每个单独创建一个 DocumentReference。 DocumentReference 只能引用单个文档,而不是文档列表:

    WriteBatch batch = db.batch();
    
    for (String id : idsList) {
        DocumentReference ref = db.collection("Collection").document(id);
        batch.delete(ref);
    }
    
    batch.commit();
    

    【讨论】:

    • 谢谢,但还有另一个问题,在我执行删除操作之前,这是有效的,所以我将该代码放在 onClickListener 中作为一个按钮,如果我没有点击按钮,它会赢'不删除,如果我按下按钮它将删除,但是一旦我输入新数据,它会立即删除而无需再次按下按钮。
    • 听起来您应该再问一个问题来解释什么不符合您的预期。
    【解决方案2】:

    参考:https://firebase.google.com/docs/firestore/manage-data/delete-data

    for (String DocId : yourListObject) {
        db.collection("Collection").document(String.valueOf(docID))
                .delete()
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "DocumentSnapshot successfully deleted!");
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "Error deleting document", e);
                    }
                });
        }
    

    删除收藏

    要删除 Cloud Firestore 中的整个集合或子集合,请检索集合或子集合中的所有文档并将其删除。如果您有较大的集合,您可能希望以较小的批次删除文档以避免内存不足错误。重复此过程,直到您删除整个集合或子集合。

    删除一个集合需要协调无数个单独的删除请求。如果您需要删除整个集合,请仅从受信任的服务器环境中执行此操作。虽然可以从移动/网络客户端删除集合,但这样做会对安全性和性能产生负面影响。

        /** Delete a collection in batches to avoid out-of-memory errors.
     * Batch size may be tuned based on document size (atmost 1MB) and application requirements.
     */
    void deleteCollection(CollectionReference collection, int batchSize) {
      try {
        // retrieve a small batch of documents to avoid out-of-memory errors
        ApiFuture<QuerySnapshot> future = collection.limit(batchSize).get();
        int deleted = 0;
        // future.get() blocks on document retrieval
        List<QueryDocumentSnapshot> documents = future.get().getDocuments();
        for (QueryDocumentSnapshot document : documents) {
          document.getReference().delete();
          ++deleted;
        }
        if (deleted >= batchSize) {
          // retrieve and delete another batch
          deleteCollection(collection, batchSize);
        }
      } catch (Exception e) {
        System.err.println("Error deleting collection : " + e.getMessage());
      }
    }
    

    更多信息请访问https://firebase.google.com/docs/firestore/manage-data/delete-data

    【讨论】:

    • 我之前尝试过,它对我不起作用,它记录了 DocumentSnapshot 已成功删除!但是我传递了一个 id 数组的问题,这种方式需要传递一个单独的文档 id 到实际删除它
    • 我编辑了我的答案,请检查
    • 谢谢,但还有另一个问题,在我执行删除操作之前,这是有效的,所以我将该代码放在 onClickListener 中作为一个按钮,如果我没有点击按钮,它会赢'不删除,如果我按下按钮它将删除,但是一旦我输入新数据,它会立即删除而无需再次按下按钮。
    • @AbdelrhmanAhmed ???但是一旦我输入新数据,它就会立即删除而无需再次按下按钮
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 2011-05-01
    • 2020-04-22
    • 2021-10-21
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多