Firestore忽略了Flutter查询中的where子句

时间:2020-09-21 11:33:16

标签: firebase flutter google-cloud-firestore

如何找到与登录电子邮件匹配的文档?

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

update:代码的输出:第一个打印是电子邮件,但在那之后应该只有一个打印,即'peV2zNJukJTWKxanR9Cx'- output image 以及Firestore图片中的数据结构:firebase console image

如果我在where子句中将'email'变量替换为'henycave@gmail.com',它也会起作用。

 @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/

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

确定要在getUserEmail()之前调用getData(),并且实际上已为该电子邮件变量分配了值?

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

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

相关问题