{ "users":{ "userid_1":{ "following":{ "userid_2":{ "name":"user2" }, "userid_3":{ "name":"user3" } } }, "posts":{ "postid1":{ "createdTime":"111", "postedBy":"userid_2" }, "postid2":{ "createdTime":"112", "postedBy":"userid_3" }, "postid3":{ "createdTime":"113", "postedBy":"userid_2" }, "postid4":{ "createdTime":"114", "postedBy":"userid_1" } } } }
我想检索“ userid_1”的以下用户的帖子,这些帖子按创建时间按限制2排序(每个api调用2个帖子)。
如何在节点的火警查询中实现?
如果关注的用户少于100个且他们有10个帖子,则可以提取以下所有用户的帖子并按创建时间对帖子进行排序。
如果一个用户有1000个关注者,而1000个用户有100个帖子,则获取所有后续用户的帖子并按创建时间进行排序是不可行的。
我希望我们可以通过SQL“ JOIN”查询轻松实现
如何在节点的fire-store中实现此实现查询?
Firestore没有服务器端JOIN的概念。一次读取操作中的所有文档必须来自同一集合。
这意味着要从多个集合中获取数据,您将需要执行多个读取操作- 每个集合至少一个,但可能还要更多。在大多数NoSQL数据库中,这是正常现象,对于您应该从客户端应用程序读取的数据量来说,速度并不像许多开发人员所认为的那样慢。
如果您需要阅读的文档数量过多,请考虑更改数据模型以减少需要的阅读次数。通常,这意味着您最终会将某些数据复制为更易于阅读的格式。
例如,在您的用例中,您似乎有一个社交网络。常见的解决方案是为每个用户存储完整的提要,以便将他们关注的人员的所有帖子作为单独的集合存储在数据库中。
因此,当用户 写 一个帖子,你写的帖子主要posts收集, 并且 也给feed了它们之后每个用户的集合。此操作称为扇出数据,虽然它使写入操作复杂并复制数据,但使读取数据的代码更简单,并且可伸缩性更高。由于在许多应用程序中读取操作比写入操作更为常见,因此许多NoSQL数据建模人员都认为这是一种有效的折衷方案。
posts
feed
这个主题范围之广,难以一概而论,因此,我建议您同时进行以下操作: