2017-02-21 122 views
1

在Firebase數據庫中,我有一個列表預訂從使用多個條件的Firebase數據庫中選擇條件

每個預訂如以下結構

{ 
    userUid: string, 
    status: string, 
    moreStuff: { 
    .... 
    } 
} 

我需要選擇相關聯的給某個用戶的所有預訂(例如:一個userUid等於用戶,這是的UID已知由應用程序)有一定的地位(例如status = confirmed)。

我可以使用下面的查詢

db.list('bookings', { 
     query: { 
      orderByChild: 'userUid', 
      equalTo: user.uid 
     } 
    }) 

選擇屬於特定用戶的預訂,但我不知道我是否能如添加額外的選擇條件status = confirmed

+0

Firebase數據庫查詢只能對單個屬性進行排序/過濾。您可能能夠將要在單個屬性中過濾的值組合在一起。請參閱http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase。或者,您可以建模數據以允許查詢。例如,這看起來像一個分類問題乍一看,我在這裏覆蓋:http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value –

回答

1

在firebase查詢中,您不能篩選多個字段。我多次遇到此限制。

我認爲如果您對數據進行不同的建模,您的挑戰將變得更加容易。我相信你在用戶和預訂之間有一對多的關係。也就是說,用戶可能有很多預訂,但預訂可能只有一個用戶。如果是這種情況,我會創建一個頂級節點「bookingLists」,其中包含每個用戶的單獨預訂列表。結構如下所示。路徑「bookingList/< userId>」包含給定用戶的預訂列表。如果您知道userId,則可以訪問該列表。它將包含該用戶的所有預訂。然後,您可以查詢每個預訂中的單個字段以進行過濾。

bookingLists 
    <userId> 
    bookings 
     <bookingKey> 
      status 
      ...other fields 

如果您需要進一步過濾預訂,您可以在客戶端使用可觀察操作映射和過濾器進行過濾。只要每個用戶沒有太大的預訂列表,這將會擴展。

+0

謝謝。明確。還有一個問題。過濾器的一個字段的限制不僅限於在中等複雜應用中使用Firebase的限制嗎?在我的情況下,你建議的解決方案的工作原理,但如果我改變標準(例如,我想'待定'預訂某個月),我將不得不在客戶端過濾(如你所建議的)。 – Picci

+1

是它的一個很大的侷限性。但是還有一些解決方法,比如組合字段或客戶端過濾。但它仍然非常不方便。但根據Firebase團隊的看法,這是實現真正縮放的必要條件。就我而言,我使用Firebase並不是爲了擴展,而是主要針對其實時性和無服務器模型。我發現我可以忍受這些限制。 –