func addRatingTransaction()

in firestore/swift/firestore-smoketest/SolutionAggregationViewController.swift [67:100]


    func addRatingTransaction(restaurantRef: DocumentReference, rating: Float) {
        let ratingRef: DocumentReference = restaurantRef.collection("ratings").document()

        db.runTransaction({ (transaction, errorPointer) -> Any? in
            do {
                let restaurantDocument = try transaction.getDocument(restaurantRef).data()
                guard var restaurantData = restaurantDocument else { return nil }

                // Compute new number of ratings
                let numRatings = restaurantData["numRatings"] as! Int
                let newNumRatings = numRatings + 1

                // Compute new average rating
                let avgRating = restaurantData["avgRating"] as! Float
                let oldRatingTotal = avgRating * Float(numRatings)
                let newAvgRating = (oldRatingTotal + rating) / Float(newNumRatings)

                // Set new restaurant info
                restaurantData["numRatings"] = newNumRatings
                restaurantData["avgRating"] = newAvgRating

                // Commit to Firestore
                transaction.setData(restaurantData, forDocument: restaurantRef)
                transaction.setData(["rating": rating], forDocument: ratingRef)
            } catch {
                // Error getting restaurant data
                // ...
            }

            return nil
        }) { (object, err) in
            // ...
        }
    }