You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:45:34