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

如何在Cloud Firestore中两次过滤数据并判断用户文档int类型Level字段是否存在

问题核心原因

你现有代码存在3个关键错误:

  • 'Stufe' is int是Dart本地的类型判断语句,返回值为布尔值,无法作为Firestore的查询条件传给后端
  • 没有将get()请求返回的QuerySnapshot实例赋值给变量,直接用QuerySnapshot类名访问实例属性,所以触发data getter不存在的报错
  • QuerySnapshot本身就没有data属性,查询到的文档列表直接存储在docs属性中
  • 原有思路效率极低:不需要拉取全量符合条件的文档再过滤,直接查询当前用户的单篇文档即可,大幅节省读请求配额和带宽
最优实现方案

直接查询当前用户对应的文档,本地判断Stufe字段类型即可:

class StufenService{
  String userID;
  StufenService(this.userID);

  final CollectionReference userTodos =
  FirebaseFirestore.instance.collection('userTodos');

  Future<bool> checkIfStufeExists() async {
    // 直接拉取当前用户的单篇文档
    final docSnapshot = await userTodos.doc(userID).get();
    if (docSnapshot.exists) {
      final docData = docSnapshot.data() as Map<String, dynamic>?;
      // 直接判断Stufe字段是否为int类型
      return docData?['Stufe'] is int;
    }
    // 文档不存在直接返回false
    return false;
  }
}
原有思路修正版(不推荐)

如果你确实需要按照先查全量符合条件文档、再匹配当前用户的逻辑实现,修正后代码如下:

Future<bool> checkIfStufeExistsOldWay() async {
  final querySnapshot = await userTodos.where('Stufe', isNull: false).get();
  // 遍历所有查询结果匹配用户ID和字段类型
  return querySnapshot.docs.any(
    (doc) => doc.id == userID && (doc.data() as Map<String, dynamic>)['Stufe'] is int
  );
}

该方案在集合数据量较大时会产生大量不必要的读请求,仅做参考不建议线上使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:27:05