根据已知子值获取Firebase节点的父值?

时间:2018-03-22 14:18:15

标签: swift firebase firebase-realtime-database

我一直在尝试根据Swift中的子节点值来获取父节点的值。我已经阅读了不同的答案并试图实施它们,但它们都没有用。

我的Firebase数据库的当前结构是:

- leaderboard
  - 0
    - score: 123
    - name: "School #1"
  - 1
    - score: 14323
    - name: "School #2"

我一直在尝试的代码是:

let query = Database.database().reference().child("leaderboard").queryOrdered(byChild: "name").queryEqual(toValue: self.userSchool)
        query.observeSingleEvent(of: .value, with:
        { snapshot in
                for child in snapshot.children
                {
                    let snap = child as! DataSnapshot
                    let key = snap.key
                    print("School key is: " + key)
                }
        })

如果我注释掉.queryEqual(toValue:self.userSchool),代码会运行并返回每个键,但是如果我离开那个部分,则根本不会发生任何事情。

如果学校是学校#1,如何让.queryEqual部分返回0?

1 个答案:

答案 0 :(得分:0)

您可以以易于构建查询的方式对数据进行非规范化。

与您已经拥有的数据结构一起,您将拥有另一个节点(即另一个数据结构),如:

- leaderboardBySchool 
  - School #1
    - id: 0
  - School #2
    - id: 1

使用NoSQL数据库,您应该毫不犹豫地以这样的方式复制数据,使您的查询更容易(也更快)执行。

根据您的评论,您可以拥有类似的节点:

- leaderboardBySchool
  -autogeneratedId1 
    - name: School #1
    - id: 0
  -autogeneratedId2
    - name: School #2
    - id: 1

并且仍然比只有一个节点更容易。

这样的东西会根据学校名称

给你一个id
var leaderboardBySchoolRef =firebase.database()  
.ref('leaderboardBySchool')
.orderByChild('name')
.startAt('School2')
.limitToFirst(1);

leaderboardBySchoolRef.once('value').then(function (snaps) {
    snaps.forEach(function(child) {
        console.log(child.val().id) 
    });
});