代码之家  ›  专栏  ›  技术社区  ›  Florian Walther

带映射字段的Firestore复合查询

  •  0
  • Florian Walther  · 技术社区  · 4 年前

    在我的聊天应用程序中,我将聊天参与者作为他们的UID存储在 Map 所以我可以这样做:

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

    问题是,当我尝试使用orderBy时

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

    我必须创建一个自定义索引。但这个索引将包含特定的用户UID,我无法为我应用程序中的每个用户创建索引。我怎样才能避开这个问题?

    1 回复  |  直到 4 年前
        1
  •  1
  •   Doug Stevenson    4 年前

    在无序查询之后,您可以在客户机上订购文档。当文档数少于10000时,这对客户端应用程序来说应该不是很费力。

        2
  •  0
  •   Alex Mamo    4 年前

    关于:

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

    这绝对不是一个选项,因为在云Firestore索引方面有一些限制:

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

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

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

    这有点旧,但我认为这段视频也可能有帮助:

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

    附笔。 当云Firestore可能变得有点贵时,您也可以依赖Firebase实时数据库。两者都能很好地协同工作。

    信息: