Reputation: 183
I want to solution for nested queries. Actually, i want to get all reviews for each movie. I have two tables:
Movie:
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
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
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
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