Parse.com嵌套查询

时间:2015-12-21 15:00:15

标签: javascript parse-platform

我想解决嵌套查询问题。 实际上,我想获得每部电影的所有评论。 我有两张桌子:

电影:

Movie

修改:

Review

可以计算每部电影的评分并将其设置为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][{},{}]

3 个答案:

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