Search code examples
javascriptparse-platform

Parse.com nested queries


I want to solution for nested queries. Actually, i want to get all reviews for each movie. I have two tables:

Movie:

Movie

Review:

Review

It's possible to calculate rating for each movie and set it to avgRating? I don't know why, but i can't get all reviews for one movie.

Parse.Cloud.define("setAvg", function(request, response) {

    var Movie = Parse.Object.extend("Movie");
    var MovieReview = Parse.Object.extend("MovieReview");

    var query = new Parse.Query(Movie);
    query.each(function(movie){
        var reviewQuery = new Parse.Query(MovieReview);
        reviewQuery.equalTo("relatedMovie", movie);
        reviewQuery.find({
          success: function(reviews){
               console.log(reviews);
            }
        });
    }).then(function() {
    response.success("Migration completed successfully.");
    }, function(error) {
    response.error("Uh oh, something went wrong.");
});
});

I getting in logs:

I2015-12-21T17:34:57.777Z][]
I2015-12-21T17:34:57.778Z][{}]
I2015-12-21T17:34:57.779Z][{},{}]
I2015-12-21T17:34:57.780Z][{},{}]
I2015-12-21T17:34:57.781Z][{},{},{}]
I2015-12-21T17:34:57.782Z][{},{}]

Solution

  • The solution was as simple as possible. Thank all for answers.

    Parse.Cloud.job("setMovieRating", function(request, response) {
    Parse.Cloud.useMasterKey();
    var Movie = Parse.Object.extend("Movie");
    var MovieReview = Parse.Object.extend("MovieReview");
    var query = new Parse.Query(Movie);
    query.each(function(movie){
            var reviewQuery = new Parse.Query(MovieReview);
            reviewQuery.equalTo("relatedMovie", movie);
            return reviewQuery.find().then(function(reviews){
                var avgRating = 0;
                for (var i=0; i<reviews.length;i++){
                    avgRating+=reviews[i].get('starRating');
                }
                avgRating = avgRating/reviews.length;
                var floatRating = Math.floor(avgRating * 100) / 100;
                movie.set('avgRating', parseFloat(floatRating.toFixed(1)));
                console.log(movie);
                movie.save();
            });
    }).then(function() {
        response.success("Success");
      }, function(error) {
        response.error("Uh oh, something went wrong.");
    });
    });