在我的角度应用程序中,我正在使用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)?
更新:
我尝试了以下操作:
给出错误消息,类型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:
我还尝试了以下方法:
但是,与Update 1中使用的版本一样,我收到了“ reduce”的错误消息 ...错误消息显示:
Cannot find name "reduce"
答案 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);
});