Firebase查询问题:忽略CurrentSubAdministrativeArea子节点查找指定userKey
Firebase 查询问题:跳过子节点层级,遍历所有子项匹配userKey
看起来你是想跳过CurrentSubAdministrativeArea的直接子节点(比如示例里的Mantova)这一层,直接遍历所有子节点下的广告来匹配userKey对吧?问题出在你当前的代码直接定位到了CurrentSubAdministrativeArea,但Firebase的查询只能在当前节点的直接子节点范围内过滤,没办法自动向下遍历一层。我给你两种可行的解决思路:
方案一:遍历所有子区域节点,逐个查询匹配的userKey
先获取CurrentSubAdministrativeArea下的所有区域节点,再对每个区域单独执行userKey的匹配查询,这样就能覆盖所有子节点里的数据:
self.ref.child("Ads").child("CurrentSubAdministrativeArea").observeSingleEvent(of: .value) { snapshot in // 遍历CurrentSubAdministrativeArea下的所有子区域节点 for areaSnapshot in snapshot.children { guard let areaSnap = areaSnapshot as? DataSnapshot else { continue } // 在每个子区域内查询匹配目标uid的userKey areaSnap.queryOrdered(byChild: "userKey") .queryEqual(toValue: uid) .observeSingleEvent(of: .value) { userSnapshot in if userSnapshot.exists() { // 找到匹配的数据,这里处理你的业务逻辑 print("匹配到的广告数据:\(userSnapshot.value ?? "无数据")") } } } }
方案二:调整数据结构(推荐,更适配Firebase查询逻辑)
如果业务允许的话,建议调整数据结构,把广告节点直接挂在CurrentSubAdministrativeArea下,同时保留区域信息作为字段,这样可以直接在父节点做查询,效率更高:
调整后的数据结构示例:
{ "Ads": { "CurrentSubAdministrativeArea": { "-L7ymBmmb...": { "areaName": "Mantova", "userKey": "目标uid", // 其他广告相关字段 }, "-L8xXzzz...": { "areaName": "OtherArea", "userKey": "其他uid", // 其他广告相关字段 } } } }
对应的查询代码:
self.ref.child("Ads").child("CurrentSubAdministrativeArea") .queryOrdered(byChild: "userKey") .queryEqual(toValue: uid) .observeSingleEvent(of: .value) { snapshot in if snapshot.exists() { // 直接获取所有匹配的广告数据 print("所有匹配的广告:\(snapshot.value ?? "无数据")") } }
重要提示:添加查询索引
不管用哪种方案,都需要在Firebase控制台的规则里给userKey添加索引,避免数据量大时查询性能过低:
方案一对应的索引规则:
{ "rules": { "Ads": { "CurrentSubAdministrativeArea": { "$area": { ".indexOn": ["userKey"] } } } } }
方案二对应的索引规则:
{ "rules": { "Ads": { "CurrentSubAdministrativeArea": { ".indexOn": ["userKey"] } } } }
内容的提问来源于stack exchange,提问作者Federic
相关产品推荐
相关产品推荐

