【问题标题】:How to retrieve user from firestore based on property如何根据属性从firestore中检索用户
【发布时间】:2019-01-11 17:06:30
【问题描述】:

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

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

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

}

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

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


更新 3:

我还尝试了以下方法:

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

Cannot find name "reduce"

【问题讨论】:

    标签: angular firebase google-cloud-firestore angularfire


    【解决方案1】:
    let user = this.db.collection("users", ref => ref.where('email', '==', "xyz@gmail.com"));
    

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

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

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

    【讨论】:

    • 感谢您的评论...我尝试了您的解决方案。不幸的是,它没有用(请参阅我的帖子的更新)
    • aysnc 等待它的承诺是不可观察的。如果需要或使用异步管道,请再次尝试我的解决方案并订阅。 .valueChanges() .pipe(reduce((acc, curr) => curr[0], {})) .subscribe(data => this.user = data) 记得在onDestroy方法中取消订阅!
    • 如果您不使用异步管道,您实际上也可以不使用管道进行订阅。 this.db.collection("users", ref => ref.where('email', '==', "xyz@gmail.com")) .valueChanges().subscribe(data => this.user = data [0]);
    • 仍然给出与您的第一个解决方案相同的错误消息...找不到名称“reduce”
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      首先是存储新用户。推荐的方法是call .doc() or .add(),以便 Firebase SDK 自动生成唯一的 id 字符串。这是一种方法规模(users/some-id-ha87sdhf87hjakshdf7323r/"displayName": "john smith" 与存储为 users/johnsmith)。

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

      Firestore 的优点在于它支持复合查询。见:Perform simple and compound queries in Cloud Firestore

      【讨论】:

      • 我正在使用 angularfire2,因此 api 与您链接到的“普通”firebase 内容略有不同...此外,我已经知道如何查询集合(请参阅我的帖子)...我只是不知道如何访问查询结果
      • 它返回一个查询快照,因此您必须使用 for 每个循环对其进行迭代。所以,你必须.then(snapshot => { snapshot.forEach(doc => { console.log(doc.id, '=>', doc.data()); }); })
      • 它不起作用(请参阅我的帖子的更新)...请注意,我使用的是 angularfire2,而您的代码适用于“普通”firebase
      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多