【问题标题】:Firestore: Get documents by field in their subcollectionFirestore:按子集合中的字段获取文档
【发布时间】:2020-06-20 13:21:03
【问题描述】:

我正在构建一个聊天应用程序,所以我有一个聊天室和用户。每个聊天室都有一个名为用户列表的子集合,基本上它是位于该聊天室中的用户列表。 我只需要向用户显示他们的聊天室(他们正在参与的聊天)。现在,我在每个用户文档中创建了另一个子集合。此集合包含聊天室文档。

这工作正常。但我认为无需在用户文档中使用额外的聊天室子集合就可以解决这个问题。也许通过查询。所以我需要这样的查询:

Query chatrooms = FirebaseFirestore.getInstance()
    .collection("Chatrooms")
    .document() //Here's the problem, I need to query through every document, not just through specific one
    .collection("User List")
    .whereEqualTo("user_id", userId);

有没有办法做到这一点?
还有一个问题,这是有效的还是我应该保留以前的解决方案?

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    您要查找的是collection group query。这样您就可以查询所有User List 子集合以查找用户文档。

    db.collectionGroup("User List").whereEqualTo("user_id", userId).get()
      .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
          @Override
          public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
              for (QueryDocumentSnapshot document : queryDocumentSnapshots) {
                 Log.i("User", document.getId());
                 Log.i("Chat room", document.getReference().getParent().getParent().getId());
              }
          }
      });
    

    【讨论】:

    • 哦,谢谢,我已经创建了一个索引并且它有效!这是将此查询的结果映射到聊天室对象列表的更好方法吗?现在我只是从您的示例中获取聊天室的 ID,并使用另一个查询来获取对象。感觉这两个查询是一个不好的解决方案。
    • 查询的结果总是来自单一的集合类型,你不能跨User List和Chatrooms连接。因此,您需要单独获取聊天室文件。这两种方法都是一样的,除非您将数据复制到每个用户文档中,在Chatrooms/$roomId/User List 或/Users/$uid/Chatrooms 下。
    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 2019-10-06
    • 2021-11-04
    • 1970-01-01
    • 2019-11-13
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多