Firestore按两个字段排序的查询

3

我在一周多前提出了一个问题。

Firestore两个字段排序

我得到的回答是:

“API支持您想要的功能,尽管我没有在文档中看到示例。”

查询条款的排序很重要。假设您有一个城市集合,感兴趣的字段是人口(h1)和名称(h2)。 要按名称排序获取人口在1000到2000之间的城市,则查询如下:

citiesRef.orderBy("population").orderBy("name").startAt(1000).endAt(2000)

这个查询需要一个复合索引,你可以在控制台中手动创建。或者根据文档所示,系统会帮助你:

***但是这返回的不是按名称排序的人口在1000和2000之间的城市,而是按名称排序的人口为1000的城市,然后是按名称排序的人口为1001的城市,然后是按名称排序的人口为1002的城市,以此类推,直到2000。

我想知道是否有一种方法可以按名称排序获取人口在1000和2000之间的所有城市。

1个回答

1
我认为您正在寻找与 population 有关的 where 子句:
citiesRef
  .where("population", ">=", 1000)
  .where("population","<",2000)

由于Cloud Firestore 不支持按照不同于提供的不等式字段排序, 因此您将无法直接按名称对查询进行排序。相反,您需要在获取数据后在客户端进行排序。

根据此页面底部的示例,这是否符合无效条件?https://firebase.google.com/docs/firestore/query-data/order-limit-data - Blue
1
当我在Android上尝试时,结果是:“无效查询。您在字段'population'上使用了不等式过滤器(whereLessThan(),whereGreaterThan()等),因此您还必须将'population'作为第一个orderBy()字段,但是您当前的第一个orderBy()字段是'name'。” - Bob Snyder
哎呀,没错。你可能需要按人口查询城市,然后在客户端按名称排序。 - Michael Bleigh
1
@Michael Bleigh - 很遗憾,当使用FirestorePagingAdapter时,这不是一个解决方案,因为FirestorePagingOptions.Builder在setQuery()方法中需要将Query作为参数。为了执行客户端排序,数据需要从DocumentSnapshot转换为列表或数组,然后进行排序。有什么建议可以将列表或数组转换回查询格式以传递到setQuery()方法中吗? - AdamHurwitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接