-
Notifications
You must be signed in to change notification settings - Fork 135
Open
Description
snippets-node/firestore/solution-aggregation/functions/index.js
Lines 11 to 37 in 9ae3a00
| exports.aggregateRatings = functions.firestore | |
| .document('restaurants/{restId}/ratings/{ratingId}') | |
| .onWrite((change, context) => { | |
| // Get value of the newly added rating | |
| var ratingVal = change.after.data().rating; | |
| // Get a reference to the restaurant | |
| var restRef = db.collection('restaurants').doc(context.params.restId); | |
| // Update aggregations in a transaction | |
| return db.runTransaction(transaction => { | |
| return transaction.get(restRef).then(restDoc => { | |
| // Compute new number of ratings | |
| var newNumRatings = restDoc.data().numRatings + 1; | |
| // Compute new average rating | |
| var oldRatingTotal = restDoc.data().avgRating * restDoc.data().numRatings; | |
| var newAvgRating = (oldRatingTotal + ratingVal) / newNumRatings; | |
| // Update restaurant info | |
| return transaction.update(restRef, { | |
| avgRating: newAvgRating, | |
| numRatings: newNumRatings | |
| }); | |
| }); | |
| }); | |
| }); |
If it's retried, I think it's possible to get a wrong value for newNumRatings.
Metadata
Metadata
Assignees
Labels
No labels