Sasha  Odegov
Sasha Odegov

Reputation: 183

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][{},{}]

Upvotes: 3

Views: 116

Answers (3)

Sasha  Odegov
Sasha Odegov

Reputation: 183

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.");
});
});

Upvotes: 0

Baptiste Truchot
Baptiste Truchot

Reputation: 341

I can see several potential issues :

  • You should use a background job instead of a function to ensure you have enough time

  • You should define the reviewQuery inside the each block to avoid mixing

  • If you can have more than 100 ratings for one movie, you should set the limit of query to 1000 (which is the maximum limit - if there could be more than 1000, you will have to make the same query several times while incrementing the skip parameter).

Upvotes: 0

zahreelay
zahreelay

Reputation: 1742

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

    var Movie = Parse.Object.extend("Movie");
    var MovieReview = Parse.Object.extend("MovieReview");
    var reviewQuery = new Parse.Query(MovieReview);
    var query = new Parse.Query(Movie);
    query.equalTo("relatedMovie",reviewQuery);
    query.find(function(movie){
        //do whatever you want with the query results
    });
});

Upvotes: 1

Related Questions