Flutter Cloud Firestore如何实现equal与not equal组合查询?
Flutter Firestore中equal与not equal组合查询的实现方法
在cloud_firestore: ^4.5.1版本中,可通过Filter.and()和Filter.or()实现多条件过滤,基础用法示例如下:
Future<List> getListModelos() async { List objetoList1 = []; Query<Map<String, dynamic>> collectionReferenceObjetoList1 = db.collection('/modelos').where( Filter.and( Filter("name", isEqualTo: "John"), Filter("id", isEqualTo: "01"), ), ); QuerySnapshot queryObjetoList1 = await collectionReferenceObjetoList1.get(); queryObjetoList1.docs.forEach((documento) { objetoList1.add(documento.data()); }); return objetoList1; }
但当组合isEqualTo与isNotEqualTo时出现查询无结果的情况,问题出在条件的取值类型上:
你当前的查询代码是:
db.collection('/modelos').where( Filter.and( Filter("name", isEqualTo: "John"), Filter("id", isNotEqualTo: "null"), ), );
这里的"null"是字符串类型,而如果你的Firestore文档中id字段的实际值是**null(空值)**而非字符串"null",这个条件不会匹配到目标文档——因为你在比较字符串和空值,两者不相等,导致过滤逻辑不符合预期。
正确的实现方式
如果你的需求是筛选name等于"John"且id不为空值(null)的文档,有两种写法:
写法一:使用isNotEqualTo: null
db.collection('/modelos').where( Filter.and( Filter("name", isEqualTo: "John"), Filter("id", isNotEqualTo: null), ), );
写法二:使用isNull: false
db.collection('/modelos').where( Filter.and( Filter("name", isEqualTo: "John"), Filter("id", isNull: false), ), );
补充说明
Firestore中,若文档不存在id字段,会被视为该字段值为null,因此上述两种写法都会排除这类文档。如果你的实际需求是排除id字段值为字符串"null"的文档,那原写法逻辑正确,但需要确认数据库中id字段的实际值类型是否为字符串。
内容的提问来源于stack exchange,提问作者xpe
相关产品推荐
相关产品推荐

