gpt4 book ai didi

arrays - Firestore - 将数据附加到结构内的单个值

转载 作者:行者123 更新时间:2023-11-30 11:23:36 24 4
gpt4 key购买 nike

如何更新结构内的单个值。目前,我正在使用以下函数获取集合的多个文档中的所有数据。数据结构如下:

  • 人物 - 集合
    • 文档ID
      • 姓名:“乔”
      • friend (对象)
        • 1(对象)
          • 姓名:“莎莉”
        • 2(对象)
          • 姓名:“山姆”
    • 文档ID
      • 姓名:“艾米丽”
      • friend (对象)
        • 1(对象)
          • 姓名:“彼得”。

如果我运行下面的代码,它只会创建一个新数组,而我想将两者合并在一起。任何帮助是极大的赞赏。非常感谢!!

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()
}
}
}
}
}
}

我希望数组看起来像什么:

[姓名:乔, friend :[“姓名”:莎莉,“姓名”:萨姆]],[姓名:艾米丽, friend :[姓名:彼得]]

更新代码

    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 的查询速度非常快,因此您可以为人和 friend 提供不同的集合。

例如,在您的“人员”集合中,您拥有所有用户的姓名以及您可能需要的其他属性...电子邮件、年龄、性别等。

然后在第二个集合中,您可以添加每个用户的关系。例如,“Friends”包含字段为friendA: AAA、FriendB: BBB 的文档。这样您的数据中就不会有任何重复项。

您这样做的方式会创建太多您不需要的重复项。例如,在您的 Joe 文档中,您已将 Sally 设置为 friend 。但随后在您的 Sally 文档中,您必须将 Joe 设置为 friend 。这使得数据库更难以维护并且存在大量重复项。

如果您为“人和 friend ”创建两个不同的集合,则获取代码也会变得更简单。

关于arrays - Firestore - 将数据附加到结构内的单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51003452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com