【问题标题】:Getting parent value of Firebase node based on known child value?根据已知的子值获取 Firebase 节点的父值?
【发布时间】:2018-09-01 00:42:34
【问题描述】:

我一直在尝试根据 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),代码会运行并返回每个键,但如果我保留该部分,则什么都不会发生。

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

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

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

    连同您已有的数据结构,您将拥有另一个节点(即另一个数据结构),例如:

    - 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) 
        });
    });
    

    【讨论】:

    • 不幸的是,学校名称包含对 Firebase 密钥无效的字符,我试图避免在整个数据库中重复学校列表,因为它们数量可观:/ 我很欣赏这个想法,我会考虑的
    • 我认为您的修订仍然会给我留下同样的问题。我无法访问父节点键,在您的示例中它将是 autogeneratedId1。我的代码没有返回那个值,我必须做同样的事情来实现你的解决方案,因为我最初只知道学校名称。
    • @user2928362 你不能在这个新的数据结构中使用 orderByChild 吗?你应该可以根据学校名称找到节点,然后获取id
    • @user2928362 看看我的答案,我已经用一种解决方案对其进行了调整
    • 我将您的解决方案转换为 swift,但它只是返回了一个错误,指出 id 不是有效的键,可能是因为代码没有在 autogeneratedIds 的级别以下搜索
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2017-03-19
    • 2018-07-23
    • 2023-03-09
    • 2020-04-27
    相关资源
    最近更新 更多