You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:25:20