【问题标题】:In Firestore, how can I query items created within a date range and order by a different field?在 Firestore 中,如何查询在日期范围内创建的项目并按不同字段排序?
【发布时间】:2023-03-11 11:18:02
【问题描述】:

我正在尝试为“上周/月/年的热门帖子”创建查询。我认为这很简单,但我遇到了 Firestore 查询规则的限制。

这是我最想运行的查询:

db
  .collection(MY_COLLECTION)
  .where('created', '>', new Date(fromDate))
  .orderBy('score', 'desc')

这给了我这个错误:

FirebaseError:查询无效。你有一个 where 过滤器 'created' 字段上的不等式( 或 >=),因此您还必须 使用“created”作为您的第一个 Query.orderBy(),但您的第一个 Query.orderBy() 改为在字段 'score' 上。

对于这些类型的查询是否有已知的策略或解决方法?

【问题讨论】:

  • 目前我唯一的想法是有一个每日 cron 作业,在所有帖子上设置字段 isWithinWeekisWithinMonthisWithinYear,以便我可以将其用作相等过滤器。有更好的选择吗?

标签: javascript firebase google-cloud-firestore


【解决方案1】:

要解决您遇到的错误,您应该首先按created 字段排序,如下所示:

db
  .collection(MY_COLLECTION)
  .where('created', '>', new Date(fromDate))
  .orderBy('created', 'desc')
  .orderBy('score', 'desc')

这在documentation:

如果您有一个带有范围比较的过滤器(、>=), 您的第一个订单必须在同一个字段中。

请注意,您需要为此查询创建索引。为此,只需运行一次查询,然后在您将收到的错误消息中找到要调用的 URL 以创建索引。


如果要查询两个日期之间的所有文档,可以使用如下查询:

db
  .collection(MY_COLLECTION)
  .where('created', '>', new Date(fromDate))
  .where('created', '<=', new Date(toDate))
  .orderBy('created', 'desc')
  .orderBy('score', 'desc')

【讨论】:

  • 很好的回答雷诺。对于 Gus:这确实意味着您将首先获得按 created 字段的值排序的结果,这可能不是您想要的。所以你必须在你的应用程序代码中使用它们才能得分。
  • 感谢您添加此额外信息,弗兰克! @FrankvanPuffelen
  • 感谢您的回答,但这并不能解决我的问题,因为我需要按分数排序。我不能只在应用程序代码中这样做,因为在此期间可能有数千个帖子。我在查询代码中省略了它,但我也有一个限制子句。
  • @FrankvanPuffelen 和 Renaud 我知道这是对索引工作方式的限制,但我认为这将是一个非常普遍的要求,并且已经有了一些最佳实践方法。你还有什么可以指出我的,或者我对原始问题的评论是实现这一目标的最佳方式吗?谢谢:)
  • 实现它的最好方法是在查询中进行过滤,然后在客户端对结果进行重新排序。如果客户端可以通过网络加载数千个帖子的数据,它肯定也可以在合理的时间内对这些数据进行排序。
猜你喜欢
  • 1970-01-01
  • 2019-05-28
  • 2018-04-10
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
相关资源
最近更新 更多