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(对象)
          • 姓名:“山姆”
    • 文档ID
      • 姓名:“艾米丽”
      • 朋友(对象)
        • 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()
                    }
                }
            }
        }
    }
}
我希望阵列的外观:

[姓名:乔,朋友:[姓名:萨利,姓名:萨姆]],[姓名:艾米莉,朋友:[姓名:彼得]]

更新代码

    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对象并添加到数组中。