[英]Angular Fire fetching related data from same collection
我在查詢我的 firestore 項目時遇到了一個奇怪的行為。 項目的一位用戶就像系統的所有者,我們稱他為生產者。 而其他users
,可以屬於一個producer
,所以我有一個users
集合,其中我有一個名為producer
的字段,帶有producer ID
,如下所示。
{user: {id: '...', producer: '...', ...}
我有一個稱為轉移的功能,我可以將現金從一個用戶帳戶轉移到另一個帳戶,但僅限於同一生產者的用戶內部。 所以我需要獲取生產者與登錄用戶相同的所有用戶,在這個集合上,這是我的 function:
constructor(
private afAuth: AngularFireAuth,
private afs: AngularFirestore
) { }
fetchUsers() {
return this.afAuth.authState.pipe(
switchMap( user => { // Here I have the logged user
return this.afs.doc(`users/${user.uid}`).valueChanges() // Here I need his details on users collection
}),
first(),
switchMap( (user: any) => {
return this.afs.collection('users',
ref => ref.where('producer', '==', user.producer) // Now I want the other users from same producer
).valueChanges()
})
)
}
但它不起作用,結果上唯一的用戶是調用 function 的用戶。 這是 Angular Fire 的限制還是我做錯了?
我認為這可能是一個錯誤,因為我可以使用 get on document 然后 on collection 來解決這個問題:
return this.afAuth.authState.pipe(
switchMap( user => {
return this.afs.doc(`users/${user.uid}`).get()
}),
first(),
map( usuario => {
return usuario.data()
}),
switchMap( (usuario: any) => {
return this.afs.collection('users', ref => ref.where('produtor', '==', usuario.produtor)).get()
}),
first(),
map( data => {
let users = []
data.docs.map( doc => {
users.push(doc.data())
})
return users
})
)
這樣,它返回生產者produtor與登錄用戶相同的所有用戶。 如果有人能解釋我為什么,我將不勝感激。
看起來您的 OR 查詢邏輯不正確。
return this.afs.collection('users',
ref => ref.where('producer', 'in', [user.producer, user.uid])
).valueChanges()
https://firebase.google.com/docs/firestore/query-data/queries
事實上,您似乎根本不需要 OR 條件。 為什么將user.producer
設置為兩種不同的類型?
即:如果user.producer
始終設置為生產者 ID,那么您可以只擁有:
return this.afs.collection('users',
ref => ref.where('producer', '==', user.uid)
).valueChanges()
當你在 Angular Fire 中調用 .valueChanges() 時,它會返回一個 observable。
Observables 開辟了一個連續的通信渠道,隨着時間的推移,可以在其中發出多個數據值。
所以我們需要從 Observable 中獲取一個值,為此我們需要訂閱它。 您可以使用 for valueChanges 調用文檔並附加一個 pipe(take(1)),如下所示,但 get() 非常方便。
this.afs.doc(`users/${user.uid}`).valueChanges()
.pipe(take(1))
.subscribe(v => {
console.log(v);
});
如果您需要任何進一步的說明,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.