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

时间:2018-06-23 17:21:00

标签: arrays swift firebase struct google-cloud-firestore

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

  • 人物-收藏
    • DocumentID
      • 名称:“乔”
      • 朋友(对象)
        • 1(对象)
          • 名称:“ Sally”
        • 2(对象)
          • 名称:“ Sam”
    • DocumentID
      • 名称:“艾米丽”
      • 朋友(对象)
        • 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()
                    }
                }
            }
        }
    }
}

我希望数组显示如下:

[名称: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()
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的操作方式似乎对您的要求而言太复杂了。 Firestore查询速度非常快,因此您可以为人和朋友提供不同的收藏集。

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

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

您执行此操作的方式会创建过多不需要的重复项。例如,在Joe文档中,您已将Sally设置为朋友。但是,在您的Sally文档中,您必须将Joe设置为朋友。这使得数据库更难以维护并且具有大量重复项。

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