Google Cloud Fuction на Firebase не возвращает правильное значение - PullRequest
0 голосов
/ 07 марта 2020

Используя облачную функцию Google, я пытаюсь создать сервис рейтинга ресторанов.

Когда пользователь нажимает кнопку отправки в приложении android, я хочу, чтобы его рейтинг был рассчитан и обновлен в БД.

Но есть проблема с кодом функции облака Google, который не может получить среднее значение рейтинга из базы данных. Среднее значение рейтинга всегда равно 0, даже если оно не равно нулю.

Как вы видите на этом снимке экрана, я поставил «1» для numRating и «3» для среднего рейтинга, но оба возвращают «0».

enter image description here

Плз, скажите, как мне это исправить ...

Это метод события 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...