【问题标题】:Cloud Firestore fetch multiple documents at onceCloud Firestore 一次获取多个文档
【发布时间】:2018-08-24 14:27:31
【问题描述】:

我正在构建一个包含UsersSports TeamsArticles 的应用程序。

user 可以关注任何sports team,其中sports team 一些users 将成为贡献者并发布articles 供关注者查看。

一百万 users 可以关注同一个 sports team,但只有少数用户,例如10,将是可以发布 articles 关于特定 sports team 的贡献者。

阅读 Firestore,我可能倾向于按以下方式构建数据:

例如结构:

  • Users (根集合)
    • 用户(文档)
      • 以下SportsTeamsID(地图)
  • Sports Teams (根集合)
    • 运动队(文档)
      • contributingUsersID(地图)
      • Posts (子集合)
        • 发布(文档)

根据我的理解,如果我想执行查询以列出我为其贡献者的所有 Sports Teams,我只需在 Sports Teamswhere('contributingUsersIDs.someUserID', '==', true) 上进行提取。

问题: 您打算如何进行一个简单的查询来检索您作为特定用户关注的所有Sports Teams 文档的列表?在Datastore 中,我只需要ofy().load().keys(followingSportsTeamsIDsKeys).values()

正确的解决方案是简单地进行提取以检索用户拥有的所有followingSportsTeamsIDs,然后如果说他们遵循一千个不同的Sports Teams 来简单地执行db.collection("teams").document("someTeamID").getDocument 并为每个 ID 发出请求 for在客户端循环?这似乎太过分了?但也许不是因为Firestore 仍然是一个持久连接?

或者,我该如何为Firestore 重构我的数据?

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    无法使用 Cloud Firestore 一次获取多个文档(目前)。

    您是对的,如果您必须循环执行请求,这些类型的连接可能会变得非常低效。这并不像您为每个人进行单独的 HTTP 调用那样糟糕(正如您所说,他们将共享一个连接),但这并不好。

    相反,您可能想要复制一些数据。例如,如果您有一个屏幕,用户可以在其中看到他们关注的每个团队,那么您可能只需要该屏幕上每个团队的团队名称。在这种情况下,您可以让用户看起来像这样:

    {
    
      username: "whatever",
      teams: [
        {
          id: "team_1",
          name: "Team One"
        }
        ...
      ]
    }
    

    这是您在使用 NoSQL 数据库时必须做出的权衡之一。优化数据结构的使用方式!

    【讨论】:

    • 不幸的是,这种结构不可行,因为我确实有一个屏幕,每个用户都可以在其中看到他们关注的团队,但对于每个团队,它也会向他们展示最新文章的预览。如果有 100,000 人关注一个团队,那么每次将新文章发布到每个用户文档时,我都必须写 100,000 次。除非有别的办法? - 似乎唯一的解决方案是在循环中单独获取每个文档,并希望 Firebase 做得好,并在未来提供一次获取多个文档的选项?正如你所说,这只是(目前)。
    • 不得不放弃通过唯一标识符在数据库中检索整体的能力并不是使用 NoSQL 数据库的权衡。这是任何数据库的基本 101 东西,即使是 1970 年代的数据库。缺少此功能完全取决于 Google 的决策。
    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2018-08-02
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多