【发布时间】:2019-02-02 23:10:25
【问题描述】:
我正在尝试使用 Firestore 做三件事:
- 获取“contentType”字段为“basic”的文档,
- 获取在某个时间点之后创建的文档。 (示例中为凌晨 5 点。)
- 根据“喜欢”计数对文档进行排序。
contents 集合中的文档如下所示(省略不必要的细节):
{
date: Timestamp;
contentType: string;
response: {
like: Number;
};
}
这是 iOS 代码:
let dateKey = "date"
let likeKey = "response.like"
let startDate = Date().setLocalHour(5)
let timestamp = Timestamp(date: startDate)
Firestore.firestore()
.collection(path: .contents)
.whereField(.contentType, isEqualTo: "basic")
.whereField(dateKey, isGreaterThanOrEqualTo: timestamp)
.order(by: dateKey, descending: true)
.order(by: likeKey, descending: true)
.limit(to: Constant.fetchLimit)
order(by: dateKey) 部分是必需的,因为 Firebase 需要它。否则会抛出异常,抱怨 where 子句和 orderby 子句不匹配。
我已经创建了一个显示contents
contentType Ascending date Descending response.like Descending 的复合索引。
预期与结果
我希望文档按like 计数排序,并且所有文档都是“基本”类型并在今天凌晨 5 点之后创建。
相反,只应用前两个条件,而完全忽略第三个条件。两种条件的不同组合起作用。是这三个条件结合起来是行不通的。
所以我的问题是,由于 Firebase 文档没有说明有两个以上的多个 orderby 和 where 组合,这是一个错误还是不可能的事情?
【问题讨论】:
-
Firestore 查询只能执行范围查询或一键排序。在您的情况下,这意味着您必须要么 按
dateKey排序/过滤或 获得按order排序的结果,但您可以同时拥有两者。这已记录在 here 中,在 this video 和 this question 中进行了介绍。 -
很抱歉,但我阅读了文档,问题中只有一个范围过滤器,尽管有两种。文档说一个范围过滤器,而不是排序。
-
where 子句有两个,但第一个是相等,而不是范围。我已经看到了你链接的问题,但它完全不同。
-
@FrankvanPuffelen 请检查我的 cmets。这不是重复的。
-
您订购的是两个键 (
.order(by: dateKey, descending: true).order(by: likeKey, descending: true)),由于 Todd 在我链接的视频中解释的原因,这 (afaik) 是不可能的。
标签: ios swift firebase google-cloud-firestore