Это сложно объяснить, но я сделаю все возможное.У меня есть структура базы данных в Firebase, например:
Пользователь (пользователь Firebase)
Соединение
- Электронная почта
- Группа
- Роль
UserDetails
- Электронная почта
- Имя
- Фамилия
- Адрес
По сути, я пытаюсь получить текущего пользователя с помощью AngularFireAuth, затем запросить коллекцию сведений о пользователе с помощью user.email, а затем запросить коллекцию Connectionsпо user.email.Наконец, сопоставьте все это модели User и сохраните ее в наблюдаемой.
РЕДАКТИРОВАТЬ:
Я выяснил, как получить первую коллекцию для наблюдаемого пользователем, но не уверен, гдеиди отсюда.
this.user = this.afAuth.authState.pipe(
map(user => user.email),
flatMap(email => this.afs.collection<User>(this.userRef, res => res.where('email', '==', email)).valueChanges()),
mergeAll(),
first()
)
РЕДАКТИРОВАТЬ 2:
Так вот, что я придумал, и это работает, но это просто кажется не правильно.Я могу сказать, что есть влияние на производительность (хотя и не так сильно).Вероятно, никогда не будет использовать это для производства, но я буду продолжать использовать это решение в качестве доказательства концепции, пока не найду лучший способ.
this.user = this.afAuth.authState.pipe(
map(user => user.email),
concatMap(email => {
return zip(
this.afs.collection<Connection>('connections', res => res.where('email', '==', email)).snapshotChanges().pipe(mergeAll(), first()),
this.afs.collection<User>('users', res => res.where('email', '==', email)).snapshotChanges().pipe(mergeAll(), first())
)
}),
map(([connection, details]) => {
const a = connection.payload.doc.data() as Connection;
const b = details.payload.doc.data() as User;
return { ...a, ...b };
})
)