【问题标题】:Firestore is ignoring the where clause in the query in flutterFirestore在flutter中忽略查询中的where子句
【发布时间】:2021-01-07 11:58:31
【问题描述】:

如何找到与登录邮箱匹配的文档?

当我尝试使用下面的代码时,Firestore 忽略了 where 子句,并且只是将所有文档带到学生集合中,无论它是否匹配。 我已经读过在 Firebase 控制台中手动添加索引是可行的,但我试过了(screenshot of the console)但没有运气。代码有问题还是我没有正确索引?

更新:代码的输出:第一个打印是电子邮件,但之后应该只有一个打印是 'peV2zNJukJTWKxanR9Cx'- 以及firestore图像中的数据结构:

如果我在 where 子句中用 'henycave@gmail.com' 替换 'email' 变量,它也可以工作。

 @override
  void initState() {
    super.initState();
    getUserEmail();
    getData();
  }


    getUserEmail() async {
    try {
      final user = await _auth.currentUser();
      if (user != null) {
        loggedInUser = user;
        email = loggedInUser.email;
        print(email);
      }
    } catch (e) {
      print(e);
    }
  }

  getData() async {
    var documents = await _firestore
        .collection('students')
        .where('email', isEqualTo: email)
        .getDocuments();

    for (var document in documents.documents) {
      print(document.data['grade']);
    }
  }

还有我的 pubspec.yaml:

    name: school
    description: A new Flutter application.
    
    
    version: 1.0.0+1
    
    environment:
      sdk: ">=2.1.0 <3.0.0"
    
    dependencies:
      flutter:
        sdk: flutter
    
    
      cupertino_icons: ^0.1.2
      firebase_core: ^0.4.5
      firebase_auth: ^0.16.1
      cloud_firestore: ^0.13.7
    
    
    dev_dependencies:
      flutter_test:
        sdk: flutter
     
    flutter:
      uses-material-design: true
      assets:
        - images/

【问题讨论】:

  • 我从未见过 Firestore 忽略查询子句,所以怀疑还有其他事情发生。您能否将您的问题编辑为:1)打印email 的值,然后包括更新后的代码及其输出,2)包括您的查询返回的不应该返回的文档的屏幕截图,3)打印文档 ID 和电子邮件,并包括更新的代码及其输出。这些加在一起就是minimal, complete, verifiable example,所以我也建议研究一下这个链接。
  • @FrankvanPuffelen 我已经编辑了这个问题,我希望它现在可以理解,我期待你对这个问题的建议
  • 1) 如果你在getData 的第一行添加print(email)(或类似的东西),它会打印什么? 2)如果你在查询之后print(documents.size),它会打印什么?

标签: firebase flutter google-cloud-firestore


【解决方案1】:

仅当传递给 compare 的参数为 null 或空时,Firestore 才会忽略 where 子句。

您确定在 getData() 之前调用了 getUserEmail() 并且实际上已为 email 变量分配了值吗?

请尝试更正这些,您的问题应该会得到解决。

此外,除非您比较 where 子句中的两个或多个字段,否则您不需要索引。

【讨论】:

  • 我已经编辑了问题,现在您可以看到我在 getData() 之前调用了 getUserEmail() 并且 email 变量不为空,因为 print 语句会打印电子邮件
【解决方案2】:

我终于找到了答案,因为我在 initState() 中调用了这两个方法,并且此函数不采用 async 和 await 关键字,因此 getData() 函数在 getUserEmail() 完成将电子邮件保存在电子邮件变量。所以 where 子句得到一个未来而不是一个值。因此我将这两个函数合并为一个函数,以便它们可以正确等待另一个函数完成。并在 initState() 中调用该函数

【讨论】:

  • 非常感谢,你为我节省了很多时间,保重 :)
猜你喜欢
  • 2012-09-18
  • 2021-09-12
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
相关资源
最近更新 更多