Firebase:搜索具有唯一ID的子节点

时间:2016-04-13 21:49:03

标签: ios swift firebase

我对Firebase很新,并且有一个排名应用,我的结构目前如下所示:

{
  "Rankings" : {
    "-KFGX5H3rLSnpPvupakm" : {
      "Sports Teams" : {
        "Red sox" : 1,
        "Warriors" : 3,
        "Yankees" : 2
      }
    },
    "-KFGZkwAIl817CLDLmMp" : {
      "Beers" : {
        "Bud light" : 3,
        "Coors" : 2,
        "Pbr" : 4
      }
    }
  }
}

我正在使用childID,所以我可以按时间顺序排序。如果我想按名称搜索排名,我该如何绕过子ID呢?

例如,如果用户使用术语“体育”搜索排名,我如何通过搜索包含“体育”的所有排名来遍历我的Rankings树?

2 个答案:

答案 0 :(得分:0)

Firebase(以及许多其他NoSQL数据库)无法对动态路径进行此类深度查询。您需要做的是设置一个所谓的索引,将您要搜索的键映射到您想要查找的值。

{
  "Rankings" : {
    "-KFGX5H3rLSnpPvupakm" : {
      "Sports Teams" : {
        "Red sox" : 1,
        "Warriors" : 3,
        "Yankees" : 2
      }
    },
    "-KFGZkwAIl817CLDLmMp" : {
      "Beers" : {
        "Bud light" : 3,
        "Coors" : 2,
        "Pbr" : 4
      }
    }
  },
  "SearchTerms": {
        "Red sox" : {
          "-KFGX5H3rLSnpPvupakm": true
        },
        "Warriors" : {
          "-KFGX5H3rLSnpPvupakm": true
        },
        "Yankees" : {
          "-KFGX5H3rLSnpPvupakm": true
        },
        "Bud light" : {
          "-KFGZkwAIl817CLDLmMp": true
        },
        "Coors" : {
          "-KFGZkwAIl817CLDLmMp": true
        },
        "Pbr" : {
          "-KFGZkwAIl817CLDLmMp": true
        }
  }
}

此过程称为非正规化您的数据,并在this blog postFirebase documentation on structuring data和此article on NoSQL data modeling中对其进行了描述。我最近给出了六个类似的答案。

答案 1 :(得分:0)

我能够获得child node-id's的值。

以下是我的示例代码:

LOCATION_URL.queryOrderedByChild("email").queryEqualToValue(FIRAuth.auth()?.currentUser?.email).observeEventType(.Value, withBlock: { snapShot in

        let enumerator = snapShot.children

        while let rest = enumerator.nextObject() {

            var shot = rest.childSnapshotForPath(rest.key)
            // child node ID
            print(shot.key)

        }
    })

我希望这会对你有所帮助.. 最好的祝福, Nazar Medeiros