【问题标题】:Firestore - get the parent document of a subcollectionFirestore - 获取子集合的父文档
【发布时间】:2019-10-06 17:41:40
【问题描述】:

我正在开发一个使用具有以下层次结构的 Firestore 数据库的应用程序: 父集合: 父文件: 子集: child_document{ 字符串名称} 使用 collectionGroup 我已经能够查询具有特定名称的文档的子集合,但我不知道如何获取 parent_document

 db.collectionGroup("subcollection").whereEqualTo("name", searchText).get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if(task.isSuccessful()){
                          //here I want to get the parent id of all results
                        }
                    }
                });

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 附上数据库截图会很有帮助
  • 由于子集合的路径是/collection/{parent_id}/subcollection,如果您不知道父集合,您如何进入子集合?
  • 请不要描述您的数据库的外观,而是添加它的屏幕截图,并注明您想要获取的确切数据。也请回复@AlexMamo
  • 我按要求添加了截图,我只是想让问题更笼统。
  • 这能回答你的问题吗? Firestore query subcollections

标签: android firebase google-cloud-firestore


【解决方案1】:

QuerySnapshot 指向多个QueryDocumentSnapshot 实例。

QueryDocumentSnapshot,您可以通过以下方式获取它的集合:

snapshot.getRef().getParent()

然后父DocumentReference是:

snapshot.getRef().getParent().getParent()

所以要获得父文档的子集合:

snapshot.getRef().getParent().getParent().collection("name_of_subcollection")

是的,我同意...这本来可以更具可读性。 :)

【讨论】:

  • 谢谢,就是这样。我相信一定有一个简单的解决方案,就在这里。
  • 我通常很擅长从参考文档中获取信息,但这次我不得不四处打听。所有getBla 都在妨碍我。 :)
  • 是的,这有点棘手 =D。我自己也找不到。
  • 这仅适用于android开发吗?它似乎不适用于 javascript.. 有没有办法在 javascript 中得到它?
  • 它在 JavaScript 中的工作方式应该非常相似。类似snapshot.ref.parent.parent.collection("name_of_subcollection")。这主要是遵循参考文档中的线索,从DocumentSnapshot 开始。如果你很难让它发挥作用,你可能想发布新的问题来展示你的尝试(见how to create a minimal, complete, verifiable example),并链接回这个问题/评论以供参考。
【解决方案2】:

您可以像这样获取集合的文档:

if(task.isSuccessful()) {
        List<DocumentSnapshot> documents = task.getResult().getDocuments();
        for(DocumentSnapshot documentSnapshot : documents) {
            documentSnapshot.getId();
            // or any field documentSnapshot.get(field);
        }
}

【讨论】:

  • 这将获取子集合的文档,而不是父文档,看来您误解了我的问题。
  • 所以你想根据这个documentSnapshot来收集?
【解决方案3】:

你可以这样写

List<DocumentSnapshot> documentSnapshotList = value.getDocuments();
                for (DocumentSnapshot documentSnapshot : documentSnapshotList) {
                    DocumentReference dr = documentSnapshot.getReference().getParent().getParent();
                    // or any field documentSnapshot.get(field);
                    assert dr != null;

                  ));
                } //for end

【讨论】:

  • 已经由 Frank van Puffelen 回答
猜你喜欢
  • 1970-01-01
  • 2022-07-08
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2021-07-12
  • 2023-03-08
  • 2018-04-03
相关资源
最近更新 更多