【问题标题】:Firestore compound query with map fields带有地图字段的 Firestore 复合查询
【发布时间】:2020-11-25 08:18:33
【问题描述】:

在我的聊天应用程序中,我将聊天的参与者作为他们的 UID 存储在 Map 中,这样我就可以进行如下查询:

.whereEqualTo("participantUIDs.$currentUserUid", true)
.whereEqualTo("participantUIDs.$partnerUid", true)

问题是当我尝试将它与 orderBy 一起使用时

.whereEqualTo("participantUIDs.$currentUserUid", true)
.orderBy("lastMessageSentTimestamp")

我必须创建一个自定义索引。但是这个索引将包含那个特定的用户 UID,我不能为我的应用程序中的每个用户创建一个索引。我该如何规避这个问题?

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    您可以在无序查询后在客户端对文档进行排序。当文档数量少于 10,000 个时,这对客户端应用程序应该不会造成太大负担。

    【讨论】:

      【解决方案2】:

      关于:

      我无法为我的应用中的每个用户创建索引。

      这绝对不是一个选项,因为 Cloud Firestore 索引存在一些限制:

      但是,即使您设法保持在这些限制以下,也不能为每个加入您的应用的用户手动创建索引。

      在我看来,对于您的特定用例,您应该考虑扩充您的数据结构以允许反向查找。这意味着您应该创建一个 participantUIDs 集合,您应该在其中保留每个用户的列表。这种技术称为denormalization,是 Cloud Firestore 或 Firebase 实时数据库等 NoSQL 数据库的常见做法。

      但请记住,“没有完美的数据库结构”:

      它有点老了,但我认为这个视频可能也有帮助:

      更多关于为什么需要索引的信息:

      P.S. 当 Cloud Firestore 可能变得有点贵时,您也可以依赖 Firebase 实时数据库。两者配合得非常好。

      信息:

      【讨论】:

      • 嗨弗洛里安!我的回答有帮助吗?我可以帮助您了解其他信息吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2020-01-16
      • 2021-06-23
      • 2020-12-18
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多