簡體   English   中英

Angular 從同一集合中獲取相關數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM