Javascript Parse.com嵌套查询

Javascript Parse.com嵌套查询,javascript,parse-platform,Javascript,Parse Platform,我想找到嵌套查询的解决方案。 实际上,我想得到每部电影的所有评论。 我有两张桌子: 电影: 审查: 可以计算每部电影的分级并将其设置为avgRating吗? 我不知道为什么,但我不能得到一部电影的所有评论 Parse.Cloud.define("setAvg", function(request, response) { var Movie = Parse.Object.extend("Movie"); var MovieReview = Parse.Object.ex

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

电影:

审查:

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

我可以看到几个潜在的问题:

  • 你应该使用后台作业而不是函数来确保你有足够的时间

  • 您应该在每个块内定义reviewQuery以避免混合

  • 如果一部电影的收视率可以超过100,则应将查询限制设置为1000(这是最大限制-如果可能超过1000,则必须在递增skip参数的同时多次进行相同的查询)


    • 解决方案尽可能简单。 谢谢大家的回答

      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.");
      });
      });
      
      Parse.Cloud.job(“setMovieRating”),函数(请求、响应){
      Parse.Cloud.useMasterKey();
      var Movie=Parse.Object.extend(“Movie”);
      var MovieReview=Parse.Object.extend(“MovieReview”);
      var query=newparse.query(电影);
      query.each(函数(电影){
      var reviewQuery=newparse.Query(MovieReview);
      reviewQuery.equalTo(“relatedMovie”,movie);
      返回reviewQuery.find().then(函数(reviews){
      var=0;
      
      对于(var i=0;我不会忘记
      return
      reviewQuery.find()之前)
      可能重复的除了问题中列出的选项外,还有在插入/更新/删除评级时使用云代码更新单独表格的选项。我已经看到了这个答案。但首先,我需要获得每部电影的所有评论。感谢您的回答,但它不起作用。每个评论都没有关系o Movie。是否要获取所有电影,然后计算平均值?我有一个包含电影评论的表。电影可能包含3个评论。我需要从3个评论中计算每部电影的平均值。Thanx作为您的答案。1)我只在测试中使用该函数。2)我已经修复了它3)最大值-为3级当某些评论缺失时,是否有相同电影的其他评论不缺失?抱歉,我不完全理解您的意思。每部电影包含3个评论。数据由脚本填充。脚本在插入之前检查所有数据。每个评论包含评等和与电影相关的字段。
      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.");
      });
      });