如何根据属性从Firestore检索用户

时间:2018-08-03 19:14:19

标签: angular firebase google-cloud-firestore angularfire

在我的角度应用程序中,我正在使用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)?


更新:

我尝试了以下操作:

enter image description here

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

我还尝试了以下方法:

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);

}

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

P.S.:Firestore中确实存在一封电子邮件为“ xyz@gmail.com”的用户。


更新3:

我还尝试了以下方法:

enter image description here

但是,与Update 1中使用的版本一样,我收到了“ reduce”的错误消息 ...错误消息显示:

Cannot find name "reduce"

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

第一件事是存储新用户。推荐的方法是call .doc() or .add(),以便Firebase SDK自动生成唯一的ID字符串。这是一种方法(用户/ some-id-ha87sdhf87hjakshdf7323r /“ displayName”:“ john smith”与存储为users/johnsmith相比)。

因此,假设您的users集合中充满了单个用户,每个用户都有一个Firestore生成的uid,则只需查询您想要的内容即可。

Firestore的好处是它支持复合查询。参见:Perform simple and compound queries in Cloud Firestore

答案 2 :(得分:0)

好吧,我找到了解决问题的方法:

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

this.userData.subscribe(users => { 

  this.user = users[0];

  console.log("this is the user:" + this.user);

});