【问题标题】:Deleting a document from firestore without name of collection从 Firestore 中删除没有集合名称的文档
【发布时间】:2020-11-11 16:51:41
【问题描述】:

我有一个 android 应用程序,用户可以在其中将 pdf 存储在文件夹中。我使用 Firebase Storage 存储 PDF,使用 Firestore 存储 url 及其名称。我在删除 Firestore 数据时遇到问题。 目前这是我的数据结构:

FolderName
    |
    |---PDFname--URL
               --Name

基本上 FolderName 是集合。所以我有多个收藏。在每个集合/文件夹中都有多个 PDF。特定文件夹的多个 PDF 详细信息存储为文档。每个文档都有字段:URL、名称。

现在我希望用户能够删除特定文件夹的特定 PDF。当他点击一个文件夹时,他可以看到所有的 PDF。他长按 PDF 将其删除。但现在我不知道它所属的集合/文件夹。如果我知道它的 uid 但不知道集合,是否可以删除文档?

或者有没有更好的方法来构建我的数据?

编辑:这是我的 Firestore 数据的屏幕截图-

1,2,3,4 等是文件夹。文件夹 3 包含我要删除的 PDF。此文件夹/集合可能包含多个 PDF。

【问题讨论】:

  • 所以你有多个集合为FolderName?除此之外,不要描述您的数据库的外观,而是添加它的屏幕截图并指出您要删除的确切数据。
  • @AlexMamo 我已经添加了截图,谢谢
  • 文件夹 3 包含我要删除的 PDF。 您只想从“文件夹”3 中删除名为 Resources.pdf 的文档? 此文件夹/集合可能包含多个 PDF。 那么可能有更多文档,您要删除所有文档吗?或者您想一次从多个集合中删除文档?请回答所有这些问题?
  • 我一次只从一个文件夹中删除一个 PDF。因此 Resources.pdf 只会从文件夹 3(或集合)中删除。如果这个文件夹有多个 pdf,我一次只会删除其中一个。虽然我可以删除所有这些,但如果我单独删除所有这些。

标签: java android firebase google-cloud-firestore


【解决方案1】:

根据delete operation in Cloud Firestore的官方文档,删除文档的方法如下:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference collRef = rootRef.collection("3");
DocumentReference pdfRef = collRef.document("Resources.pdf");
pdfRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
    @Override
    public void onSuccess(Void aVoid) {
        Log.d("TAG", "Resources.pdf successfully deleted!");
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Log.w("TAG", "Error deleting document", e);
    }
});

此代码将从集合3 中永久删除Resources.pdf 文档。如果您需要删除同一集合中的另一个文档,您应该将上面的pdfRef 更改为:

DocumentReference pdfRef = collRef.document("AnotherResources.pdf");

如果您想从另一个集合中删除 PDF,例如从 2 集合中,只需使用:

CollectionReference collRef = rootRef.collection("2");
DocumentReference pdfRef = collRef.document("ResourcesName.pdf");

【讨论】:

  • 谢谢@AlexMamo,但我的问题是,我不知道收藏的名称。为了显示 PDF,我有一个包含 recyclerview 和自定义适配器类的活动。我可以访问活动中的文件夹名称,但不能访问 recyclerAdapter。所以这就是为什么我问如果我们不知道集合名称,我们是否可以使用它的 uid 删除一个文档,或者如果我可以从我实际删除文档的 recyclerAdapter 类中访问 folderName 字符串。
  • 如果您不知道集合名称,则无法删除该文档。集合的名称必须添加到您的参考中。你不能在不知道集合名称的情况下删除某些东西。
【解决方案2】:

如果我知道它的 uid 但不知道集合,是否可以删除一个文档?

不,这是不可能的。您必须能够构建文档的完整路径才能将其删除。

用动态数据命名集合不是一个好主意。集合的名称应该是静态的,并且始终为您的代码所熟知,以便您可以使用它们来执行查询。

请考虑将所有动态数据放在文档中,这样就可以通过对静态命名集合的查询来找到它们。我不清楚您到底应该做什么,但是您绝对应该为自己创建一种基于可用输入查找文档的方法。这通常涉及在文档中创建可用于查询的属性。

另请注意,Firestore 的组织方式不像计算机文件系统。集合与文件夹完全不同。它们只是文档的容器,您应该设计您的数据,以便您可以使用集合进行查询以查找文档。

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2020-09-08
    • 2018-11-01
    • 2018-03-22
    • 1970-01-01
    • 2021-06-11
    • 2021-11-14
    相关资源
    最近更新 更多