Firestore - добавление данных к одному значению внутри структуры - PullRequest
0 голосов
/ 23 июня 2018

Как я могу обновить одно значение внутри структуры. В настоящее время я извлекаю все данные из нескольких документов коллекции с помощью функции ниже. структура данных выглядит следующим образом:

  • Люди - коллекция
    • DocumentID
      • Имя: "Джо"
      • Друзья (Объект)
        • 1 (Объект)
          • Имя: "Салли"
        • 2 (Объект)
          • Имя: "Сэм"
    • 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()
                    }
                }
            }
        }
    }
}

Как бы я хотел, чтобы массив выглядел так:

[имя: Джо, друзья: ["имя": Салли, "имя": Сэм]], [имя: Эмили, друзья: [имя: Питер]]

Обновленный код

    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 голосов
/ 06 июля 2018

То, как вы это делаете, кажется слишком сложным для того, что вам нужно.Firestore имеет довольно быстрые запросы, поэтому вы можете иметь разные коллекции для людей и друзей.

Допустим, например, что в вашей коллекции "people" у вас есть имена всех пользователей и другие свойства, которые вам могут понадобиться ... Электронная почта, возраст, пол и т. Д. И т. Д.

Затем во второй коллекции вы можете добавить отношения для каждого пользователя.Например, «Друзья» содержат документы с полями friendA: AAA, FriendB: BBB.Тогда у вас не будет дубликатов в ваших данных.

То, как вы это делаете, создает слишком много дубликатов, которые вам не нужны.Например, в вашем документе Джо вы указали, что Салли является другом.Но тогда в вашем документе Салли вы должны будете указать, что Джо - друг.Это делает базу данных более сложной для обслуживания и с большим количеством дубликатов.

Если вы сделаете две разные коллекции для людей и друзей, код для извлечения также станет проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...