Cloud Firestore一次获取多个文档

时间:2018-03-15 16:59:14

标签: firebase google-cloud-firestore

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

user可以跟随sports team sports teamusers articles内的users将成为投放人并发布sports team以供关注者查看。

一百万articles可以跟随相同的sports team,但只有少数用户,例如10,可以发布Users个特定Sports Teams的贡献者。

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

E.g。结构

  • Posts (Root Collection)
    • 用户(文档)
      • followingSportsTeamsIDs(map)
  • Sports Teams (Root Collection)
    • 运动队(文件)
      • contributionsUsersIDs(地图)
      • Sports Teams (子集)
        • 发布(文件)

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

问题: 你是如何做一个简单的查询来检索你作为特定用户遵循的所有ofy().load().keys(followingSportsTeamsIDsKeys).values()文档的列表?在followingSportsTeamsIDs我只需Sports Teams

正确的解决方案是简单地执行提取以检索用户拥有的所有db.collection("teams").document("someTeamID").getDocument,然后如果说它们遵循千种不同的Firestore来简单地执行Firestore并提出请求对于客户端上的for循环中的每个ID?那似乎过分了?但也许不是因为{{1}}仍然是一个持久的连接?

或者,我打算如何重构{{1}}的数据?

1 个答案:

答案 0 :(得分:0)

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

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

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

{

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

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