2017-06-01 135 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