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

Flutter Firestore报错:DocumentReference无where方法

问题解决:Firestore调用where报错"The method 'where' isn't defined for the type 'DocumentReference'"

错误原因

你调用.doc(id)后得到的是DocumentReference对象,它指向Firestore中的单个具体文档,这类对象没有where方法——where是CollectionReference(集合引用)的专属方法,用于筛选集合内的多个文档。你的代码逻辑混淆了「单个文档获取」和「集合条件查询」的层级。

解决方案(分两种场景)

场景1:想查询集合中符合「指定文档ID + 难度条件」的文档

直接在集合层面构建查询,同时加入文档ID的筛选条件:

chamaBancoDeDados(curso, materia, id, dificuldade) async {
  Map<String, dynamic> dados = {};
  final queryRef = FirebaseFirestore.instance
      .collection('cursos')
      .doc(curso)
      .collection(materia)
      // 筛选文档ID等于指定值
      .where(FieldPath.documentId, isEqualTo: id)
      // 同时筛选dificuldade数组包含'normal'
      .where('dificuldade', arrayContainsAny: ['normal']);
  
  final querySnapshot = await queryRef.get();
  if (querySnapshot.docs.isNotEmpty) {
    try {
      dados = querySnapshot.docs.first.data() as Map<String, dynamic>;
      print("dados são: $dados");
    } on StateError catch (e) {
      print('Erro tentando adquirir o documento no banco de dados: $e');
    }
  } else {
    print('O documento não existe ou não atende à condição de dificuldade');
  }
  return dados;
}

场景2:先获取指定ID的文档,再判断其难度是否符合要求

如果目标是获取指定ID的文档,仅在本地验证字段条件:

chamaBancoDeDados(curso, materia, id, dificuldade) async {
  Map<String, dynamic> dados = {};
  final documentoRef = FirebaseFirestore.instance
      .collection('cursos')
      .doc(curso)
      .collection(materia)
      .doc(id);
  
  final documento = await documentoRef.get();
  if (documento.exists) {
    try {
      dados = documento.data() as Map<String, dynamic>;
      // 本地验证dificuldade条件
      final dificuldades = dados['dificuldade'] as List?;
      if (dificuldades == null || !dificuldades.contains('normal')) {
        dados = {};
        print('O documento existe mas não atende à condição de dificuldade');
      } else {
        print("dados são: $dados");
      }
    } on StateError catch (e) {
      print('Erro tentando adquirir o documento no banco de dados: $e');
    }
  } else {
    print('O documento não existe no banco de dados');
  }
  return dados;
}

额外注意点

原代码使用then异步回调但直接返回dados,会导致返回的是空Map(因为异步操作还未完成),所以改成async/await确保数据获取完成后再返回。

内容的提问来源于stack exchange,提问作者Luiz Sanches

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:46:04