Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Firestore中,我如何查询在不同字段的日期范围和顺序内创建的项目?_Javascript_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 在Firestore中,我如何查询在不同字段的日期范围和顺序内创建的项目?

Javascript 在Firestore中,我如何查询在不同字段的日期范围和顺序内创建的项目?,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我试图创建一个查询“上周/月/年的热门帖子”。我原以为这会很简单,但我在Firestore的查询规则方面遇到了限制 下面是我理想情况下希望运行的查询: db .collection(MY_COLLECTION) .where('created', '>', new Date(fromDate)) .orderBy('score', 'desc') 这给了我一个错误: FirebaseError:查询无效。您有一个带有 字段“created”上的不等式(=),因此您还必须 使用

我试图创建一个查询“上周/月/年的热门帖子”。我原以为这会很简单,但我在Firestore的查询规则方面遇到了限制

下面是我理想情况下希望运行的查询:

db
  .collection(MY_COLLECTION)
  .where('created', '>', new Date(fromDate))
  .orderBy('score', 'desc')
这给了我一个错误:

FirebaseError:查询无效。您有一个带有 字段“created”上的不等式(=),因此您还必须 使用“created”作为第一个查询。orderBy(),但是 Query.orderBy()改为位于字段“score”上


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

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

db
  .collection(MY_COLLECTION)
  .where('created', '>', new Date(fromDate))
  .orderBy('created', 'desc')
  .orderBy('score', 'desc')
这在以下文件中有所说明:

如果有带范围比较(=)的过滤器, 您的首次订购必须在同一字段上

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


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

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

哪里('created','目前我唯一的想法是在所有帖子上设置字段
isWithinWeek
isWithinMonth
isWithinYear
,这样我就可以用它作为一个平等过滤器。有更好的选择吗?很好的答案勒诺。对于格斯来说:这确实意味着你会得到按值排序的结果<代码>首先创建
字段,这可能不是您想要的。因此,您必须在应用程序代码中使用它们才能得分。感谢您添加此额外信息Frank!@FrankvanPuffelenThanks作为答案,但是这并不能解决我的问题,因为我需要按分数排序。我不能在应用程序代码中这样做,因为在这段时间内,e可能有数千篇文章。我在查询代码中省略了它,但我还有一个限制条款。@Frankvanpoffelen和Renaud我知道这是索引工作方式的限制,但我认为这是一个非常常见的要求,并且已经有一些最佳实践方法。您还可以做些什么请告诉我,或者我对原始问题的评论是实现这一点的最佳方式吗?谢谢:)实现这一点的最佳方式是在查询中进行过滤,然后在客户端对结果进行重新排序。如果客户端可以通过网络加载数千篇文章的数据,它肯定也可以在合理的时间内对这些数据进行排序。