首页 文章

查询Firebase嵌套数据以检查特定值 - iOS Swift

提问于
浏览
0

我有一系列用户ID字符串,我想在Firebase实时数据库中查询数据,以查看每个用户ID是否具有特定的性别 .

var nearbyUserArray = [String]()

以下是我在Firebase中提供的数据示例 . 第二级深是用户ID(0UFhIgGAwIY1btnBeNaNkJruYKJ3) . 我想要做的是循环我的用户ID数组和每个用户ID检查该特定用户是否为男性 . 如果用户是女性,请从阵列中删除该用户ID .

"profiles" : {
    "0UFhIgGAwIY1btnBeNaNkJruYKJ3" : {
      "dateOfBirth" : "May 11, 1987",
      "gender" : "Female",
      "higherAgeRange" : 36,
      "interestedIn" : "Male",
      "lowerAgeRange" : 29,
      "name" : "Sally"
    },
    "6vNjngZqoTbd4oGudip3NX78pu32" : {
      "dateOfBirth" : "December 23, 1990",
      "gender" : "Male",
      "higherAgeRange" : 39,
      "interestedIn" : "Female",
      "lowerAgeRange" : 25,
      "name" : "Bob"
    }

你会怎么建议我做到这一点?我想最小化我在客户端下载和操作的数据量 . 以下是我试图做的但我不能让它工作 . 任何想法为什么这总是返回Null?

func getUsersWithinGenderCriteria() {
    for user in nearbyUserArray {
      DatabaseService.shared.profilesRef.child(user).queryOrdered(byChild: "gender").queryEqual(toValue: "Female").observeSingleEvent(of: .value) { [weak self] (snapshot) in
        print("snap: \(snapshot)")
        // The idea is if snapshot is Female, remove the user ID from the array. If the snapshot is Null, keep it in the array. However, this is not working as all snapshots come back as null.
      }
    }
  }

此外,这是我设置的安全规则 .

"profiles": {
    "$userId": {
     ".indexOn": ["gender"]
    }
   }

1 回答

  • 2

    执行查询时,Firebase会将您查询的位置下的每个子节点的属性与传入的值进行比较 .

    我假设 profilesRef 指向数据库中的 /profiles . 在这种情况下,您的代码中的 profilesRef.child(user) 已指向特定用户的配置文件 . 然后,当您运行查询时,您正在查询该特定用户的每个属性 .

    您想要做的是让 gender 等于 Female 的所有用户 . 在这种情况下,您应该查询用户列表:

    DatabaseService.shared.profilesRef.queryOrdered(byChild: "gender").queryEqual(toValue: "Female")...
    

    请注意,您还应该在运行查询的级别上定义索引,所以在 /users 上:

    "profiles": {
      ".indexOn": ["gender"]
    }
    

    另一种替代方法(可能更好地扩展)是不完全使用查询,而是加载数组中每个用户的 gender 属性 . 在(近似)代码中:

    for user in nearbyUserArray {
      DatabaseService.shared.profilesRef.child(user).child( "gender").observeSingleEvent(of: .value) { [weak self] (snapshot) in
        if snapshot.value == "Female" {
          print("snap: \(snapshot)")
        }
      }
    }
    

相关问题