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

时间:2017-12-14 02:51:33

标签: ios swift firebase firebase-realtime-database

我有一系列用户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 个答案:

答案 0 :(得分: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)")
    }
  }
}