首页 > 解决方案 > 如何根据属性从firestore中检索用户

问题描述

在我的 Angular 应用程序中,我使用的是 Angularfire2 和 Firestore。

从文档中我知道我可以使用以下命令通过电子邮件“xyz@gmail.com”获取用户(其中​​ db 是 AngularFirestore 的一个实例):

this.db.collection("users", ref => ref.where('email', '==', "xyz@gmail.com"));

然而,

let user = this.db.collection("users", ref => ref.where('email', '==', "xyz@gmail.com"));

不会在变量“user”中使用电子邮件“xyz@gmail.com”保存用户,而是在整个集合“users”中保存用户。

如何通过电子邮件“xyz@gmail.com”获取用户?然后我怎样才能获得用户的属性(例如,用户的 id)?


更新:

我尝试了以下方法:

在此处输入图像描述

给出错误消息,属性“then”在类型 AngularFirestoreCollection 上不存在。

我还尝试了以下方法:

let user = this.db.collection("users", ref => ref.where('email', '==', "xyz@gmail.com"))
.valueChanges()
.pipe(reduce((acc, curr) => curr[0], {}));

这也给出了语法错误。

最后,我只是尝试了这个:

let users = this.db.collection("users", ref => ref.where('email', '==', "xyz@gmail.com"));
let user = users[0];
console.log(user);

这没有给出语法错误。但是,“用户”是未定义的。


更新 2:

我也试过这个:

private async getUser() {

   let users = await this.db.collection("users", ref => ref.where('email', '==', "xyz@gmail.com"));

   let user = users[0];
   console.log(user);

}

但是,“用户”仍然是“未定义的”。

PS:firestore 中确实存在电子邮件“xyz@gmail.com”的用户。


更新 3:

我还尝试了以下方法:

在此处输入图像描述

但是,与更新 1 中使用的版本一样,我收到“减少”错误...错误消息显示:

Cannot find name "reduce"

标签: angularfirebasegoogle-cloud-firestoreangularfire

解决方案


let user = this.db.collection("users", ref => ref.where('email', '==', "xyz@gmail.com"));

不会给你一个用户,而是会给你一个具有该电子邮件属性的用户集合(数据库中可能有多个)如果你知道你只有一个我认为你可以使用:

.valueChanges()
.pipe(reduce((acc, curr) => curr[0], {}))

仅获取集合中的第一个元素


推荐阅读