Firestore过滤不生效始终返回全部文档,如何解决?
问题排查与解决方案
我一眼就瞅到问题所在啦——Firestore的查询对象是不可变的,你当前代码里调用query.where()后没把返回的新查询对象赋值回去,导致最终返回的还是原始的未过滤集合引用!
错误原因分析
你这段代码里:
let query : firebase.firestore.Query = ref; query.where('status', '==', status); return query;
where()方法不会修改原有的query对象,而是返回一个全新的Query实例。相当于你根本没应用过滤条件,自然会拿到全部文档。
修正后的代码
把where()的结果重新赋值给query就搞定了:
this.loads$ = this.status$.switchMap(status => afs.collection<Load>('loads', ref => { let query : firebase.firestore.Query = ref; // 关键:把where返回的新Query赋值给query变量 query = query.where('status', '==', status); return query; }).valueChanges() );
额外注意事项
- 如果
status$可能发出null值,建议加个判断避免无效查询:this.loads$ = this.status$.switchMap(status => afs.collection<Load>('loads', ref => { let query : firebase.firestore.Query = ref; if (status) { // 只有当status不为null时才添加过滤 query = query.where('status', '==', status); } return query; }).valueChanges() ); - 确认你的Firestore数据库里
loads集合的文档确实有status字段,并且字段值和你传入的status类型完全一致(比如都是字符串,别出现数字和字符串不匹配的情况)。
内容的提问来源于stack exchange,提问作者Noober
相关产品推荐
相关产品推荐

