【问题标题】:Compare values with an array of values with Firebase. Swift使用 Firebase 将值与值数组进行比较。迅速
【发布时间】:2018-01-09 10:16:44
【问题描述】:

我有一个值需要与一组值进行比较。基本上,用户需要检查它是否与另一个用户有相同的项目。但是我正在努力解决这个问题,因为我如何获得一组用户的项目?通常,当您观察一个值时,您会执行以下操作:

Database.database().reference(withPath: "users/\(userID)/itemList").observeSingleEvent...

但是,当涉及到用户 itemList 数组时,如果有多个 ID,如何实现呢?我想将一个或多个用户项目与其他用户项目进行比较,并检查它们是否匹配,以便对匹配的用户数组进行排序。

如果已经有这方面的示例,请帮助指导我。

更新

这就是我的数据结构的样子:

{
  "users": {
    "EWJGFYmVTzOiHgnq42ebhrg2fj": {
      "firstName": "Friederike",
      "itemList": [
        2: true,
        3: true,
        0: true
      ]
    },

    "C076OYmVTzOiHgnq4wPQtY2XpED2": {
      "firstName": "Ian",
      "itemList": [
        0: true,
        1: true,
        3: true
      ]
    },
    "Juoiuf0N6qNmkm32jrtu6X6UK62": {
      "itemList": [
        0: true
      ],
      "firstName": "Jack"
    }
  }
}

更新 2.0

有了下面的答案,我可以查询项目表,但仍然无法查询匹配的键,因为可能有 多个 数组,因此我不能用它来过滤或任何东西。

【问题讨论】:

  • 要做到这一点,您可能必须调整您的数据结构。请发布它,以便我提供帮助。
  • @DoesData 请查看更新后的问题。所以基本上你是用户 Juoiuf0N6qNmkmUM4qYlM6X6UK62 并且你只想用与你匹配的 itemList 查询用户。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

好的,因此对于您当前的数据结构,您必须查询用户下的所有节点,然后比较数组,这是非常低效的。在不修改结构的情况下,没有直接或简单的方法可以做到这一点。所以我建议你修改你的数据结构,让每个项目都有一个拥有它的所有用户的列表。像这样的:

{
  "items": {
    "0": {
      "EWJGFYmVTzOiHgnq42ebhrg2fj": "Friederike",
      "C076OYmVTzOiHgnq4wPQtY2XpED2": "Ian",
      "Juoiuf0N6qNmkm32jrtu6X6UK62": "Jack"
    },

    "1": {
      "C076OYmVTzOiHgnq4wPQtY2XpED2": "Ian"
    },

    "2": {
      "EWJGFYmVTzOiHgnq42ebhrg2fj": "Friederike"
    }
    //....
  }
}

根据您要显示的内容,您可能希望存储比用户 UID 和用户名更多的信息。您可以使用这样的查询来查询与您拥有相同项目的所有用户:

let ref = Database.database().reference()
// assuming you already have the current users items stored in an array
for item in items {
    ref.child("items").child(String(item)).observeSingleEvent(of: .value, with: { snap in
        for child in snap.children {
            let child = child as? DataSnapshot
            if let key = child?.key, let name = child?.value as? String {
                // do something with this data
            }
        }
    })
}

Firebase 数据库不是 SQL,因此数据应为 denormalized 或重复数据,以便优化查询。 Firebase 实际上建议您避免使用nesting data。请查看此question 了解更多信息。

希望有帮助

与 cmets 中提出的问题相关的代码

假设您将 UID 或具有相同项目的用户名存储在字符串数组中,您可以使用 prevent duplicates 使用 .contains()

var namesWithMatchingItems = [String]()

if !namesWithMatchingItems.contains(nameYouJustFetched) {
    namesWithMatchingItems.append(nameYouJustFetched)
}

【讨论】:

  • 非常有帮助。您是否建议我有一个单独的项目价值表和拥有项目的用户?此外,在您的数据结构中如何将项目存储给用户?
  • 将项目存储给用户不会改变。您只需创建上面的结构,以便每个项目还具有所有拥有它的用户的列表。请记住,我们正在复制数据。然后检索存储在“users”->“uid”->“items”中的用户项目,遍历该列表并为每个项目检索也拥有该项目的用户。这就是我上面的查询的设计方式。
  • 我一直在尝试您的解决方案。只是想知道,将用户保存为项目 > 0 > 用户 > uid 而不是您的示例项目 > 0 > uid 是否更好。这样,当我循环到该项目以获取它的名称时,我不会获得所有用户 ID。
  • 你为什么要实现这个取决于你想要得到什么信息。我真的不知道您要存储什么信息或为什么。您应该修改数据结构,使其适合您的需求,而不会使事情变得过于复杂。
  • 我明白,我认为这种结构可能不适合我,因为假设用户从他们的列表中删除了该项目,那么它还必须检查项目表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2013-10-23
  • 2013-06-04
相关资源
最近更新 更多