Firestore综合索引排序未修改顺序

时间:2018-08-27 00:03:33

标签: android firebase google-cloud-firestore

问题

使用Firestore多属性复合索引排序,返回的数据顺序不变。将其与对一个属性执行的原始排序进行比较。当前,返回的数据仅按时间戳排序,并没有应用复合索引。

预期

使用时间戳 qualityScore 的复合索引时,数据应按照 qualityScore 属性进行排序。

实施

FirestorePagingOptions.Builder<Content>()方法setQuery()使用查询结果。

val options: FirestorePagingOptions<Content> = FirestorePagingOptions.Builder<Content>()
            .setLifecycleOwner(this)
            .setQuery(viewModel.contentFeedQuery, config, Content::class.java).build()

我正在从onBindViewHolder的{​​{1}}中读取结果。

FirestorePagingAdapter

原始排序

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int, content: Content) {
            println("QUALITY_SCORE: " + content.timestamp + " " + content.qualityScore)
            viewHolder.bind(content)
        }

结果

return FirestoreCollections.contentCollection
.collection(ALL_COLLECTION)
.orderBy(TIMESTAMP, DESCENDING)
.whereGreaterThanOrEqualTo(TIMESTAMP,getTimeframe(WEEK))  

综合索引排序

2018-08-26 01:15:08.548 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Fri Aug 24 15:17:26 PDT 2018 17.0
2018-08-26 01:15:08.574 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Fri Aug 24 13:30:44 PDT 2018 17.0
2018-08-26 01:15:11.698 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Fri Aug 24 11:16:47 PDT 2018 16.0
2018-08-26 01:15:11.728 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Fri Aug 24 08:09:52 PDT 2018 18.0
2018-08-26 01:15:11.777 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Fri Aug 24 07:38:36 PDT 2018 21.0
2018-08-26 01:15:11.804 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Fri Aug 24 06:16:23 PDT 2018 20.0
2018-08-26 01:15:11.849 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Thu Aug 23 15:39:59 PDT 2018 15.0
2018-08-26 01:15:11.890 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Thu Aug 23 07:23:51 PDT 2018 1.0
2018-08-26 01:15:11.915 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Wed Aug 22 16:15:02 PDT 2018 5.0
2018-08-26 01:15:11.947 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Wed Aug 22 08:00:12 PDT 2018 22.0
2018-08-26 01:15:12.000 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Tue Aug 21 17:28:03 PDT 2018 19.0
2018-08-26 01:15:12.050 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Tue Aug 21 08:59:06 PDT 2018 6.0
2018-08-26 01:15:12.115 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Tue Aug 21 08:17:53 PDT 2018 7.0
2018-08-26 01:15:12.167 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Mon Aug 20 22:40:56 PDT 2018 9.0
2018-08-26 01:15:12.235 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Mon Aug 20 06:58:18 PDT 2018 10.0
2018-08-26 01:15:12.318 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Mon Aug 20 04:07:27 PDT 2018 12.0
2018-08-26 01:15:12.367 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Sun Aug 19 21:08:31 PDT 2018 8.0
2018-08-26 01:15:12.410 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Sun Aug 19 15:11:37 PDT 2018 14.0
2018-08-26 01:15:12.449 27668-27668/app.carpecoin I/System.out: QUALITY_SCORE: Sun Aug 19 03:35:52 PDT 2018 200.0

结果

return FirestoreCollections.contentCollection
.collection(ALL_COLLECTION)
.orderBy(TIMESTAMP, DESCENDING)
.orderBy(QUALITY_SCORE, DESCENDING)
.whereGreaterThanOrEqualTo(TIMESTAMP,getTimeframe(WEEK))  

综合索引设置

我在测试各种组合时设置了2个复合索引,以便获得在特定的时间戳之后按 qualityScore 排序返回的数据的结果。 enter image description here

1 个答案:

答案 0 :(得分:1)

您致电.orderBy(TIMESTAMP, DESCENDING).orderBy(QUALITY_SCORE, DESCENDING)。这意味着文档首先按降序时间戳排序,而当文档相同时,按降序质量分数排序。

由于结果集中的所有文档都有唯一的时间戳,因此这是唯一可见的结果。只有当多个文档的第一个排序字段的值相同时,第二个排序字段才有意义。