2017-06-01 121 views
1

考慮到火力地堡數據庫的結構如下:火力地堡數據庫排序更深的孩子

    • 的Game1
      • $ playerUidA
        • 得分:50
      • $ playerUidB
        • 得分:10
      • .....
    • GAME2
      • $ playerUidC
        • 得分:20
      • $ playerUidD
        • 得分:30
      • .....
    • game3
      • .....

我想運行一個將返回所有遊戲節點的查詢,其中每個遊戲節點(玩家)的孩子將根據得分進行排序。遊戲節點包含每個玩家的UID,並且每個UID節點包含玩家的分數。我也存儲其他數據,但是,爲了這個例子,我將只使用分數。

我可以使用單個查詢嗎?類似於 rootRef.child("root").orderByChild("score")?不幸的是,似乎沒有工作。

或者實現這一目標的唯一方法是通過手動排序客戶端上的項目?

@Puf - 希望你會回答這個問題:)

回答

0

如果你想玩家排序的所有遊戲分數,所有你需要做的是與你的.indexOn規則才能起作用。

{ 
    "rules": { 
    "$gameId": { 
     ".indexOn": "score", 
     "$playerUid": { 
     ... 
     } 
    } 
    } 
} 

這將保持您的數據在數據庫中的排序,所以當您檢索它時,您將準備好所有數據。但請記住,如果您想要檢索所有遊戲和所有玩家,這意味着您將獲取整個數據庫。所以你應該看看你的應用程序的需求,並可能重新考慮結構。

當縮放比例迭代遊戲並通過firebase.database().ref(gameId).limitToLast(10)獲取有限數量的用戶時,可能會有所幫助。

更新

爲了您的例子中,你將擁有所有與下面的請求的遊戲:

firebase.database().ref().once('value', snap => { 
    //prints all players for each game sorted ascending. 
    snap.forEach(game => { 
     game.forEach(player => { 
      console.log(player.val()); 
     }); 
    }); 
}); 
+0

我使用'「.indexOn」:‘分數’'中的規則數據庫和我可以檢索一個單一的遊戲節點,玩家按照得分排序。問題是,我無法檢索**所有**遊戲節點,其中每個遊戲節點將按照分數排序其子節點(玩家)。這不能用單個查詢來完成。我必須爲每個遊戲節點運行不同的查詢,或手動對客戶端上的子項進行排序。 PS。當然,我不是試圖獲取整個數據庫,結構只是一個例子。 – MScott

+0

剛剛更新了答案。希望有所幫助。 – adolfosrs

+0

嘿@MScott,它工作?如果您仍然有任何疑問,請告訴我。 – adolfosrs