如何更新结构内部的单个值。目前,我正在使用以下功能在集合的多个文档中获取所有数据。数据结构如下:
如果我运行以下代码,它将创建一个新数组,而我想将两者合并在一起。任何帮助是极大的赞赏。非常感谢!
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()
}
}
}
}
}
}
我希望数组显示如下:
[名称:Joe,朋友:[“名称”:Sally,“名称”:Sam]],[名称:Emily,朋友:[名称:Peter]]
更新代码
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()
}
}
}
}
}
}
答案 0 :(得分:0)
您的操作方式似乎对您的要求而言太复杂了。 Firestore查询速度非常快,因此您可以为人和朋友提供不同的收藏集。
比如说,在您的“人员”集合中,您拥有所有用户的名称以及可能需要的其他属性...电子邮件,年龄,性别等。
然后在第二个集合中,您可以为每个用户添加关系。例如,“朋友”包含具有以下字段的文档:friendA:AAA,FriendB:BBB。这样您的数据就不会有任何重复。
您执行此操作的方式会创建过多不需要的重复项。例如,在Joe文档中,您已将Sally设置为朋友。但是,在您的Sally文档中,您必须将Joe设置为朋友。这使得数据库更难以维护并且具有大量重复项。
如果您为“人物”和“朋友”创建两个不同的集合,则获取代码也将变得更加简单。