首页 > 解决方案 > Firestore如何查询趋势文档的帖子集合还是我应该使用数据聚合

问题描述

我正在尝试在我的应用程序上创建一个趋势页面。我希望根据帖子的点赞数和帖子的新近程度来发布热门帖子。最近有更多喜欢的人将把它排在第一位。我想要这样的东西:

let startDate = moment();
startDate.subtract(3, "days");
snapshot = await db
  .collection("/vents/")
  .where("server_timestamp", ">", startDate.valueOf())
  .orderBy("like_counter")
  .limit(10)
  .get();

这显然不起作用,因为您只能 orderBy 与 where 子句相同的字段。有人知道怎么做这个吗?如果我必须使用数据聚合在帖子上创建一个趋势属性,我可以这样做,但它会需要很多代码,而且把所有这些都写出来会有点糟糕。

如果我必须在这里使用数据聚合,我大概会这样做。对于数据库中的每条评论和点赞,我会设置一个监听器,以根据收到的新点赞或评论以及帖子的发布时间来增加或减少趋势属性。我还需要一个 pubscheduler 来浏览所有帖子并至少每天更新一次以更新趋势分数属性,即使该帖子没有收到喜欢或评论。我还可以每天一次拉出前 20 个热门帖子,而不是所有帖子,然后只更新这些帖子,因为数据库中没有趋势的其他帖子可能不需要更新。

请让我知道您是否应该为此使用数据聚合,或者是否应该构建我的查询。

标签: javascriptgoogle-cloud-firestore

解决方案


查看您正在编写的代码,您需要 orderBy 与 where 子句相同的字段,但如果您有一个带有范围比较(<、<=、>、>=)的过滤器,您的第一个排序必须在同一个字段上,棘手的是您可以使用多个 orderBy。我所说的一个例子可能是:

let startDate = moment();
startDate.subtract(3, "days");
snapshot = await db
  .collection("/vents/")
  .where("server_timestamp", ">", startDate.valueOf())
  .orderBy("server_timestamp")
  .orderBy("like_counter")
  .limit(10)
  .get();

我使用文档来获取我与您共享的代码。


推荐阅读