如何找到与登录电子邮件匹配的文档?
当我尝试以下代码时,Firestore忽略了where
子句,只是将所有文档带入学生集合中,无论是否匹配。
我已经读到在Firebase控制台中手动添加索引是可行的,但是我尝试过(screenshot of the console)并且没有运气。代码有问题吗?或者我没有正确索引它?
update:代码的输出:第一个打印是电子邮件,但在那之后应该只有一个打印,即'peV2zNJukJTWKxanR9Cx'-
以及Firestore图片中的数据结构:
如果我在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/
答案 0 :(得分:2)
我终于找到了答案,因为我正在initState()中调用这两个方法,并且此函数不使用async和await关键字,因此getData()函数在getUserEmail()完成将电子邮件保存到电子邮件变量。因此where子句获得的是未来而不是价值。因此,我将两个功能合并为一个功能,以便它们可以正确等待另一个功能完成。然后在initState()中调用该函数
答案 1 :(得分:0)
仅当传递给compare的参数为null或为空时,Firestore才会忽略where子句。
确定要在getUserEmail()
之前调用getData()
,并且实际上已为该电子邮件变量分配了值?
请尝试更正这些,您的问题应得到解决。
此外,除非要比较where
子句中的两个或多个字段,否则不需要索引。