Используя облачную функцию Google, я пытаюсь создать сервис рейтинга ресторанов.
Когда пользователь нажимает кнопку отправки в приложении android, я хочу, чтобы его рейтинг был рассчитан и обновлен в БД.
Но есть проблема с кодом функции облака Google, который не может получить среднее значение рейтинга из базы данных. Среднее значение рейтинга всегда равно 0, даже если оно не равно нулю.
Как вы видите на этом снимке экрана, я поставил «1» для numRating и «3» для среднего рейтинга, но оба возвращают «0».
Плз, скажите, как мне это исправить ...
Это метод события onClick кода приложения Android
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_submit :
if(String.valueOf(mEtxTitle.getText()) != "null"
&& String.valueOf(mEtxContent.getText()) != "null"){
submit();
}
private void submit() {
if(retrieveDataFlag){
setVars();
final DocumentReference documentReference = db.collection("restaurants").document(mPlace.getId());
// add default restaurant info to document
updateRestaurant(documentReference, restaurant);
// add location to document
addLocation(documentReference, mGeoPoint);
// add user review to document
addReview(documentReference, review, rating);
// upload photo and download url and add it to document
if(mImageUris != null){
addPhoto(storageRef, documentReference, mImageUris);
}
finish();
}else{
Toast.makeText(this,"No Place Data retrived", Toast.LENGTH_SHORT).show();
}
}
private void addReview(final DocumentReference restaurantRef, final Map<String, String> review, final Map<String, Float> rating){
restaurantRef.collection("reviews").document().set(review);
restaurantRef.collection("ratings").document().set(rating);
}
Это мой пользовательский класс 'Ресторан'
@IgnoreExtraProperties
public class Restaurant {
public String name;
public int numRatings;
public double avgRating;
public String id;
public String address;
public String website_uri;
public String phone_number;
public String opening_hours;
public String price_level;
public @ServerTimestamp Timestamp timestamp;
...
...
}
В конце концов, это функция облака Google
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
// [START_EXCLUDE]
const settings = {timestampsInSnapshots: true};
db.settings(settings);
// [END_EXCLUDE]
// [START aggregate_function]
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;
console.log(ratingVal)
// 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;
console.log("resDoc", restDoc.data())
console.log("old numRatings : ", restDoc.data().numRatings)
console.log("new numRatings : ", newNumRatings)
// Compute new average rating
var oldRatingTotal = restDoc.data().avgRating * restDoc.data().numRatings;
console.log("oldRatingTotla : " ,oldRatingTotal)
var newAvgRating = (oldRatingTotal + ratingVal) / newNumRatings;
console.log("new AvgRating : ", newAvgRating)
// Update restaurant info
return transaction.update(restRef, {
avgRating: newAvgRating,
numRatings: newNumRatings
});
});
});
});
// [END aggregate_function]