我有一个值需要与值数组进行比较。基本上,用户需要检查它是否与另一个用户具有相同的项目。但是我正在努力解决这个问题,因为我如何获得一组用户的项目?通常当你观察到一个值时,你会做这样的事情:
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
有了下面的答案,我可以通过项目表进行查询,但仍然无法查询匹配的键,因为可能有多个 数组,因此我不能用它来过滤或任何东西。
最佳答案
好的,那么对于您当前的数据结构,您必须查询用户下的所有节点,然后比较数组,这是非常低效的。在不修改结构的情况下,没有直接或简单的方法可以做到这一点。所以我建议你修改你的数据结构,让每个项目都有一个拥有它的所有用户的列表。像这样:
{
"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 数据库是 noSQL,所以数据应该是 denormalized或复制以便优化查询。 Firebase 实际上建议您避免 nesting data .看看这个question获取更多信息。
希望对你有帮助
与评论中提出的问题相关的代码
假设您将具有相同项目的用户的 UID 或名称存储在字符串数组中,您可以 prevent duplicates使用 .contains()
var namesWithMatchingItems = [String]()
if !namesWithMatchingItems.contains(nameYouJustFetched) {
namesWithMatchingItems.append(nameYouJustFetched)
}
关于ios - 使用 Firebase 将值与值数组进行比较。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48165916/