2017-06-10 74 views
1

我試圖從firebase中獲取一些數據。在我的對象中,我有Firebase查詢不允許在多個屬性上進行排序?

Recent 
    |_UniversitId 
     |_objectiId1 
     | |_ userId:1 
     | |_ timestamp:143242344 
     |_objectiId2 
      |_ userId:1 
      |_ timestamp:143243222 

我的查詢路徑是http://firbasedbname.com/Recent/UniversityId。我需要獲取userId id等於1的條目,並按照時間戳設置順序。我嘗試了以下方法,

FIRDatabaseQuery *query = [[firebase queryOrderedByChild:@"userId"] queryEqualToValue:@"1"]; 

這會正確提取我的用戶。但有沒有一種可能的方式來按照時間戳排序。要做到這一點,我試着把另一個queryOrderedByChild。但它說它只能使用一次。我該如何解決這個問題?

+0

作爲穆罕默德說(和大衛解釋了鏈接的視頻),你可以在與火力地堡數據庫的一個屬性只能訂購/過濾器。在你的情況下,似乎你可以將這兩個值組合成一個屬性並對其進行過濾。看到我的答案在這裏的一個例子:http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase –

+0

我剛剛擴大我對這個問題的答案,包括一個例子用範圍查詢('startAt'和'endAt')。 –

回答

3

queryOrderedByChild只能使用一次。 一個解決方法是

|_objectiId1 
    | |_ userId:1 
    | |_ timestamp:143242344 
    | |_ userId_timestamp:1_143242344 
    |_objectiId2 
     |_ userId:1 
     |_ timestamp:143243222 
     |_ userId_timestamp:1_143243222 

然後嘗試:

FIRDatabaseQuery *query = [[firebase queryOrderedByChild:@"userId_timestamp"] queryEqualToValue:@"1_143242344"]; 

檢查了這一點https://youtu.be/sKFLI5FOOHs?t=541


另一種方式來做到這一點是:

|_objectiId1 
     |_ userId1: 
     |  |_ objectId11:143242344 
     |  |_ objectId12:143243222 
     |_ userId2:  

然後 查詢路徑是http://firbasedbname.com/Recent/UniversityId/userId1

,然後ORDER BY值

+0

這不起作用。查詢將只讀入匹配1_1432344的節點,該節點可能只有1個。將查詢更改爲startingAt:@「1_」和endingAt:@「1_」。這將通過該節點的時間戳組件檢索用於用戶id 1排序的所有節點。否則一個很好的答案。 – Jay