Angular Firestore查询到Firestore文档

6

我有以下查询

    selectedUser$: AngularFirestoreDocument<any>;
    this.selectedUser$ = this.userCollection.ref.where('uid', '==', key)

抛出错误

类型“Query”不能赋值给类型“AngularFirestoreDocument”。在类型“Query”中缺少属性“ref”。

我尝试过了

this.selectedUser$ = this.userCollection.ref.where('uid', '==', key).get()

没有成功

基本上,我希望查询返回Firestore文档


尝试过 this.selectedUser$ = this.userCollection('yourCollection', ref => ref.where('uid', '==', key) ) 吗?这将在 valueChanges().subscribe() 中检索文档。 - Swoox
你的集合???用户集合已经给出。 - Md. Parvez Alam
4个回答

16

你所遇到的错误是因为你同时使用了Firebase原生API和AngularFire。

selectedUser$: AngularFirestoreDocument<any>;

在你的AngularFirestoreCollection上调用.ref将其转换为类型firebase.firestore.CollectionReference

话虽如此,有2种解决方法:

使用angularfire

我假设你的userCollection看起来像这样:this.afs.collection<User>。由于你正在查询一个集合,所以无法确保你的查询断言uid == key在firebase中是唯一的。因此,你查询该集合并使用limit()限制结果。这将返回一个带有一个文档的数组。 flatMap()会返回单个用户。

this.afs.collection<User>('users', ref => ref.where('uid', '==', key).limit(1))
   .valueChanges()
   .pipe(
       flatMap(users=> users)
   );

使用 firebase 原生 API:

const query = this.usersCollection.ref.where('uid', '==', key);
query.get().then(querySnapshot => {
    if (querySnapshot.empty) {
        console.log('no data found');
    } else if (querySnapshot.size > 1) {
        console.log('no unique data');
    } else {
        querySnapshot.forEach(documentSnapshot => {
            this.selectedUser$ = this.afs.doc(documentSnapshot.ref);
            // this.afs.doc(documentSnapshot.ref).valueChanges().subscribe(console.log);
            });
        }
    });

如果需要的话,这样做可以更容易地链接多个 .where 子句。


2
这对我有用,适用于最新版本:2021年7月。
this.store
    .collection("Products",ref=>ref.where("stock","==",10))
    .get()
    .subscribe(data=>data.forEach(el=>console.log(el.data())));

PS:我正在使用get(),没有事件侦听器。


0
this.afs.collection<User>('users', ref => ref.where('uid', '==', key).limit(1))
      );

4
尽管这段代码可能解决了问题,但是在回答中包含一个解释 它如何解决问题以及为什么能解决问题,会真正有助于提高您的帖子质量。请记住,你正在回答面向未来的读者,而不仅仅是原始提问者。请编辑您的答案以添加解释,并指出适用的限制和假设。 - Suraj Rao

-4
如果您能提供有关Firestore集合和TypeScript文件结构的更多详细信息,那么我们将更容易地帮助您。
但是,为了查询集合,我会执行以下操作:
  1. 在构造函数中定义一个私有的AngularFirestore。

    constructor(
      private afStore: AngularFirestore,
    ) 
    {
    }
    
  2. 定义查询并将结果传递给AngularFirestoreDocument。

    this.selectedUser$ = this.afStore
        .collection('你的集合名称').doc<any>(key);
    

这里我们只需要传递由Firestore生成的ID,我需要在一个字段上进行查询。 - Md. Parvez Alam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接