我对Firebase很新,并且有一个排名应用,我的结构目前如下所示:
{
"Rankings" : {
"-KFGX5H3rLSnpPvupakm" : {
"Sports Teams" : {
"Red sox" : 1,
"Warriors" : 3,
"Yankees" : 2
}
},
"-KFGZkwAIl817CLDLmMp" : {
"Beers" : {
"Bud light" : 3,
"Coors" : 2,
"Pbr" : 4
}
}
}
}
我正在使用childID,所以我可以按时间顺序排序。如果我想按名称搜索排名,我该如何绕过子ID呢?
例如,如果用户使用术语“体育”搜索排名,我如何通过搜索包含“体育”的所有排名来遍历我的Rankings
树?
答案 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 post,Firebase 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