如何在Flutter Firestore中组合使用where(isNotEqualTo)与orderBy
Firestore 针对包含isNotEqualTo这类不等式筛选条件的查询,有强制查询约束:进行不等式筛选的字段必须作为排序的第一个字段,之后才能添加其他自定义排序字段,你的现有写法不符合该约束,因此即使配置了单字段索引也无法正常执行查询。
正确实现代码
StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance .collection("crush") .where("user", isNotEqualTo: user.email) // 必须优先对做不等式筛选的user字段排序 .orderBy("user", descending: false) // 再按业务需求添加date字段的排序 .orderBy("date", descending: true) .snapshots(), builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) { if (!snapshot.hasData) { // 原有加载状态逻辑保持不变 } // 剩余业务渲染逻辑 } )
索引配置要求
你之前创建的单字段索引无法适配该组合查询,需要创建对应的复合索引:
- 关联集合:
crush - 字段排序顺序:
- 第一个字段
user,排序规则为升序 - 第二个字段
date,排序规则为降序
- 第一个字段
- 索引作用范围选择
集合即可
如果首次运行触发索引缺失报错,可直接复制报错日志中自带的索引创建跳转路径操作,Firebase会自动生成符合要求的复合索引,等待索引构建完成即可正常使用查询功能。
内容的提问来源于stack exchange,提问作者Kalias 29
相关产品推荐
相关产品推荐

