Arrays Firestore-将数据附加到结构中的单个值
如何更新结构中的单个值。目前,我正在使用下面的函数获取集合的多个文档中的所有数据。数据结构如下:Arrays Firestore-将数据附加到结构中的单个值,arrays,swift,firebase,struct,google-cloud-firestore,Arrays,Swift,Firebase,Struct,Google Cloud Firestore,如何更新结构中的单个值。目前,我正在使用下面的函数获取集合的多个文档中的所有数据。数据结构如下: 人物收藏 文档ID 姓名:“乔” 朋友(对象) 1(对象) 姓名:“莎莉” 2(对象) 姓名:“山姆” 文档ID 姓名:“艾米丽” 朋友(对象) 1(对象) 姓名:“彼得” 如果我运行下面的代码,它将创建一个新数组,而我希望将两者合并在一起。非常感谢您的帮助。非常感谢 func loadData() { let userRef = db.collecti
- 人物收藏
- 文档ID
- 姓名:“乔”
- 朋友(对象)
- 1(对象)
- 姓名:“莎莉”
- 2(对象)
- 姓名:“山姆”
- 1(对象)
- 文档ID
- 姓名:“艾米丽”
- 朋友(对象)
- 1(对象)
- 姓名:“彼得”
- 1(对象)
- 文档ID
func loadData() {
let userRef = db.collection("Users").document(user!)
let docRef = userRef.collection("People")
docRef.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
if let snapshot = querySnapshot {
for document in snapshot.documents {
let data = document.data()
let name = data["name"] as? String ?? ""
let newPeople = People(name: name, friends: [:])
self.peopleArray.append(newPeople)
if let friends = data["Friends"] as? [String: Any] {
for (key, _) in friends {
let number = friends[key] as? [String: Any] ?? [:]
let friendsName = number["name"] as? String ?? ""
\\ The code in which I want to update the value of friendsName into the previous set array
let newFriends = People(name: name, friendsName: friendsName)
self.peopleArray.append(newFriends)
}
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
}
}
我希望阵列的外观:
[姓名:乔,朋友:[姓名:萨利,姓名:萨姆]],[姓名:艾米莉,朋友:[姓名:彼得]]
更新代码
var friendsName: [String: [String: Int]] = [:]
var friendsArray = [String: Int]()
func loadData() {
let userRef = db.collection("Users").document(user!)
let docRef = userRef.collection("People")
docRef.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
if let snapshot = querySnapshot {
for document in snapshot.documents {
let data = document.data()
let name = data["name"] as? String ?? ""
if let friends = data["Friends"] as? [String: Any] {
for friend in friends {
let key = friend.key
let values = friend.value
let friendsDict = friends[key] as? [String: Any] ?? [:]
let friendsNameString = friendsDict["name"] as? String ?? ""
self.friendsArray.updateValue(friendsNameString, forKey: key)
}
self.friendsName.updateValue(self.friendsArray, forKey: "name")
let newPeople = People(name: name, friends: self.friendsName)
self.peopleArray.append(newPeople)
self.friendsArray.removeAll()
self.friendsName.removeAll()
}
}
}
}
}
}
你做这件事的方式似乎有点太复杂了,不符合你的要求。Firestore的查询速度非常快,因此您可以为人们和朋友收集不同的收藏 比如说,在你的“人物”集合中,你有你可能需要的所有用户的名字和其他属性。。。电子邮件、年龄、性别等 然后在第二个集合中,可以为每个用户添加关系。例如,“Friends”包含字段为friendA:AAA、FriendB:BBB的文档。这样,您的数据中就不会有任何重复项 你这样做会产生太多你不需要的重复。例如,在Joe文档中,您设置了Sally是朋友。但是在Sally文档中,你必须设置Joe是一个朋友。这使得数据库更难维护,并且有很多重复项
如果您为个人和朋友创建两个不同的集合,则获取代码也会变得更简单。您可以删除DispatchQueue.main.async,因为Firebase closure UI元素在主线程上运行。如果您仔细考虑,朋友的子节点实际上是一个快照,就像从getDocument调用返回的内容一样,可以以相同的方式进行迭代(例如,对于friends.documents中的friend),并且可以以相同的方式访问子数据。此外,在发布的代码中没有任何内容可以创建新的数组,但不清楚这到底意味着什么。嗨,Jay,非常感谢您的回复!非常抱歉,如果我不清楚这个问题,但由于我对编码相当陌生,我正在努力找到解决问题的正确方法。基本上,每个tableview单元格中都有一个tableview。外部单元格显示文档中的“名称”字段,每个内部单元格显示“朋友”对象中的“名称”字段。我想做的是从文档中的每个对象获取数据,并以数组的形式将其附加到peopleArray中。你对我怎么做有什么建议吗。非常感谢您抽出时间!嗨,Jay,请看代码下面的示例数组,因为这是我要做的。谢谢这很清楚;迭代Friends子节点(在每个DocumentID节点中),并将每个用户的朋友添加到peopleArray中。您正在将整个Friends节点强制转换为一个字典,而该字典可以被迭代。考虑朋友节点是一个快照,可以像你正在遍历人节点一样迭代来获取每个人。所以它类似于friends=friendsSnap.documents,然后在friends上迭代,以将每个friends作为name:persons\u name的key:value对的字典,然后创建friends对象并添加到数组中。