【问题标题】:Firestore OR query improvementFirestore OR 查询改进
【发布时间】:2021-08-08 19:02:52
【问题描述】:

我有一个社交网络应用程序。 我需要从我关注的任何人那里查询按日期排序的最后一个Posts。

到目前为止,我的工作查询是:

Query getRecentFriendsPost(List<String> followings, int postedDate) {
    return getUsersCollection()
        .where("uid", whereIn: followings)
        .where("postedAt", isGreaterThanOrEqualTo: postedDate)
        .orderBy("dateCreated", descending: true)
        .limit(16);
  }

不幸的是,这并不能满足我的需求。 followings 列表包含我关注的用户 ID,长度可以增长到数千。 Firestore 仅支持 whereIn 子句中的 10 项。

第二个问题,如果长度为 1000,则将 followings 列表拆分为 10 个 uid 的块将花费 100x10 次查询。

这是非常昂贵和缓慢的。

我必须使用整个followings 列表,以确保不会错过最近的帖子。

如何使用 Firestore 执行这样的查询? 如果查询检索到Postfollowings 列表允许我查询与Post 关联的User 对象。

在这种情况下我应该去RealTime Database吗? (如果我什至应该保留Firebase 产品)

我也没有找到更好的架构,如果有人知道如何改进它,将不胜感激。

【问题讨论】:

  • ... 使用 Pub/Sub 来处理这样的订阅不是更容易吗?例如,当用户使用您的应用程序时,会为用户调用 pub/sub 上的按需订阅。您是否有理由专门使用 Firebase 来执行此操作?
  • 感谢您的评论。不,没有具体原因,我只是问是否有办法使用它来降低成本/提高性能,也许是通过架构重构......我也愿意接受新的解决方案来满足我的需求。我看了一下 Pub/Sub,性能会有所提高,但价格不会。我的目标是制作一个真正基本的“Instagram-feed-like”(没有人工智能/没有基于喜欢/看过的帖子的聚合......)。
  • 那我想这真的取决于...这是针对单个用户的吗?或者它是一个互连用户的整个网络,因为我担心我的答案会有所不同。
  • 我关注的是单个特定用户应该看到的内容,这些内容与他关注的用户直接相关,以及在两次应用程序打开之间的时间增量内他关注的任何人的出版物的存在.出版物(帖子)应按日期排序,即使自当前用户上次打开应用程序以来,关注者已经发布了几篇帖子(为了简化)。我全神贯注于具有整个互连用户网络的解决方案,但也许在私人聊天中,这个问题实际上是关于 1 个特定用户。再次感谢!
  • 那么我绝对推荐在 Firestore 上使用 Pub/Sub。因为要为 Firestore 做这种事情,我相信您需要自定义索引,每个用户都有一个包含他们所有订阅的索引,并且有一个 max limit on indexes... 所以,是的,尽管聊天?聊天可以在 Firestore 中进行,并且通过 Firebase 的选项,您可以使用消息来通知某人收件箱中的新消息。 Pub/Sub 适用于类似 RSS 的提要,简而言之,一对一聊天可以在 Firestore 中工作。

标签: firebase firebase-realtime-database google-cloud-firestore


【解决方案1】:

我已将我的数据库迁移到 MongoDB,并且我可以在一个查询中完成此操作。

在传递一个包含 6000 个值的数组之前,性能不会受到影响,之后它开始在 100 毫秒以上的时间内给出结果,这对于我的用例来说仍然很好。

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多