2017-06-10 36 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