Ошибка, которую вы получаете, заключается в том, что вы смешиваете исходный API Firebase и Angularfire.
selectedUser$: AngularFirestoreDocument<any>;
Вызов .ref
на вашем AngularFirestoreCollection
преобразует его в тип firebase.firestore.CollectionReference
При этом есть 2 возможности решить вашу проблему:
Использование angularfire
:
Я предполагаю, что ваша пользовательская коллекция выглядит примерно так: 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
несколько проще, если это необходимо