Flutter中Firestore使用isGreaterThanOrEqualTo后排序异常问题
解决Firestore时间过滤+点赞数排序的查询异常问题
问题根源
Firestore有硬性查询规则:当使用不等式操作符(如isGreaterThanOrEqualTo)过滤某个字段时,查询的第一个orderBy必须指定这个被过滤的字段,之后才能添加其他排序字段。这是因为Firestore需要先通过过滤字段的排序来高效定位符合条件的文档集合,再对集合进行二次排序。
解决方案
先按过滤字段forumTimestamp排序,再按forumTotalLikes降序排序,同时需要在Firestore控制台创建对应的复合索引。
正确查询代码
_stream = FirebaseFirestore .instance .collection('forums') .where( 'forumTimestamp', isGreaterThanOrEqualTo: DateTime.now().subtract(const Duration(days: 1)).millisecondsSinceEpoch, ) .orderBy('forumTimestamp') // 必须放在第一个,满足Firestore查询规则 .orderBy('forumTotalLikes', descending: true) // 再按点赞数降序排序 .snapshots();
补充说明
首次运行该查询时,Firestore会在控制台抛出需要创建复合索引的错误,错误信息里会包含一个直接跳转至索引创建页面的链接。复制该链接打开浏览器,就能一键完成索引创建。索引生效后,查询将正确返回一天内发布、且按点赞数从高到低排列的论坛帖子。
内容的提问来源于stack exchange,提问作者Mohammad Abd-Elmoniem
相关产品推荐
相关产品推荐

