我想解决嵌套查询问题。 实际上,我想获得每部电影的所有评论。 我有两张桌子:
电影:
修改:
可以计算每部电影的评分并将其设置为avgRating吗? 我不知道为什么,但我不能得到一部电影的所有评论。
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.");
});
});
我进入日志:
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][{},{}]
答案 0 :(得分:1)
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
});
});
答案 1 :(得分:0)
我可以看到几个潜在的问题:
您应该使用后台作业而不是函数来确保您有足够的时间
您应该在每个块中定义reviewQuery以避免混合
如果一部电影的评分超过100,则应将查询限制设置为1000(这是最大限制 - 如果可能超过1000,则必须进行相同的查询多次增加跳过参数)。
答案 2 :(得分:0)
解决方案尽可能简单。 感谢大家的回答。
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.");
});
});