根据评论(对象)解析云代码生成列表

Posted

技术标签:

【中文标题】根据评论(对象)解析云代码生成列表【英文标题】:Parse Cloud Code Generate List based on a Review (object) 【发布时间】:2015-07-29 23:48:16 【问题描述】:

我正在为 Parse Cloud 代码苦苦挣扎。我正在尝试根据用户评论创建啤酒厂列表。我想我需要计算每个啤酒厂的平均评论,然后使用这个值来生成列表。我只想包括平均为 4 或更高的啤酒厂。

请原谅我对此事的无知,提前谢谢!

这是我拥有的,但它不起作用。

    Parse.Cloud.afterSave("reviewAvergae", function(request)
    var Review = Parse.Object.extend("Reviews");
    var query = new Parse.Query("Reviews");
    query.get(request.object.get("rating").id, 
        success: function(reviews) 
            var sum = 0;
            for (var i = 0; i < reviews; i++) 
                sum += reviews[i].get("rating");
            
            var ave = sum / reviews.length;
            reviews.set("average", ave);
            reviews.save();
        
    );
/*
    query.equalTo("breweryId", request.params.brewId);
    query.find(
        success: function(result) 
            var sum = 0;
            for (var i = 0; i < result.length; i++) 
                sum += result[i].get("rating");

            
            Review.set("averageRating", sum / result.length);
            Review.save();
            console.log(sum / result.length);
        
    );
*/
);
Parse.Cloud.define("featured", function(request, response) 


  var query = new Parse.Query("Reviews");
//   query.near("location", request.params.loc);
  query.withinMiles("location", request.params.loc, 50);
  query.limit(10);

  query.find(
      success: function(results) 
          var sum = 0;
          var rating;
          var ratings = new Array();
          var id;
          var ids = new Array();

          for (var i = 0; i < results.length; i++) 

              id = results[i].get("breweryId");
              ids.push(id);
              





          response.success(results);
           console.log(ratings.length);




      ,
      error: function() 
          response.error("No breweriers in your area have been reviewed.");
      

  );

);

解析我的评论对象如下所示:

注意:我的实际应用是针对 ios 并用 swift 编写的。

更新:添加啤酒厂对象后,我尝试了以下操作。我现在收到以下错误:[错误]:找不到函数(代码:141,版本:1.7.5)

Parse.Cloud.afterSave("Reviews", function(request)
    var Review = Parse.Object.extend("Reviews");
    var breweryId = Review.get("breweryId");

    var query = new Parse.Query("Reviews");
query.equalTo("breweryId", breweryId);
query.find(
    success: function(results) 
        var total = 0;
        for (var i = 0; i < results.length; i++) 
            var object =  results[i];
            total += object.get("rating");
        
        var averageRating = total / results.length;

        console.log(averageRating);

        var query = new Parse.Query("Brewery");
        query.equalTo("breweryId", breweryId);



    , error: function() 

    
  );

);

这是我在 Parse 中的对象的一些更新图像

【问题讨论】:

手头更重要的任务是在保存评论后获得啤酒厂的平均评论。我的代码的第一部分试图做到这一点,但是我有点迷路/卡住了。 【参考方案1】:

从 cmets 了解存在一个带有 Brewery 对象的外部系统。为了对啤酒厂进行 parse.com 计算,有必要在内部表示它们以进行解析,即使它基本上是指向另一个系统中的对象的指针。

所以,添加一个“啤酒厂”对象。它将从解析中获取一个 objectId,但您应该添加一个“breweryId”字符串属性,就像您的 Review 类一样。它还应该有一个“averageRating”数字属性。

现在我们需要逻辑来计算和保存平均评分,给定一个 breweryId(这是外部 id,而不是解析 objectId)...

// a very helpful toolkit for dealing with js, especially arrays
var _ = require('underscore');

function updateAverageRatingForBreweryWithId(breweryId) 
    var average;
    // get all of the reviews for this breweryId
    var query = new Parse.Query("Review");
    query.equalTo("breweryId", breweryId);
    return query.find().then(function(reviews) 
        // pull out each review's rating attribute
        var ratings = _.map(reviews, function(review)  return review.get("rating"); );
        // this is just an average computation, summing the ratings and dividing by their count
        average = _.reduce(ratings, function(memo, num)  return memo + num; , 0) / (ratings.length === 0 ? 1 : ratings.length);

        // go get the parse.com Brewery object for this breweryId
        // we will save the average rating there
        var query = new Parse.Query("Brewery");
        query.equalTo("breweryId", breweryId);
        return query.first();
    ).then(function(brewery) 
        brewery.set("averageRating", average);
        return brewery.save();
    );

此函数将外部 breweryId 作为输入,获取该啤酒厂的评论,计算平均值,然后找到具有该 breweryId 设置其 averageRating 的(您的新)Brewery 对象并保存它。

在保存评论之后调用它是一个好地方,这就是您在原始帖子中的样子。如果您希望 afterSave 在 Review 对象上工作(而不是您给它的名称或 @RyanKreager 出于某种原因提到的“评论”),则必须将 afterSave 命名(第一个参数)“Review”...

Parse.Cloud.afterSave("Review", function(request) 
    var review = request.object;
    var breweryId = review.get("breweryId");
    updateAverageRatingForBreweryWithId(breweryId);
);

现在有了一个 Brewery 对象,我们可以用真正的目标来查询它:我附近有哪些评价很高的啤酒厂?我可以为此添加一些额外的建议,但只有创建一个 Brewery 对象才有意义。

【讨论】:

我编写的唯一 javascript 是云代码。我的应用程序是用 Swift 编写的,我对 JavaScript 的了解有限。感谢您的帮助! 我想这表明你对 Cloud Code 有多熟悉。【参考方案2】:

我看到几个错误:

    您应该将average 字段存储在Brewery 对象上,而不是评论。这样,您只需更新一个对象,就可以对所有 Brewery 对象进行漂亮、整洁的查询,其中 average &gt; x 等。 breweryId 是一个字符串。这应该是指向Brewery 对象的指针。还将名称更改为 brewery 一旦你把这两件事都弄清楚了,这样的事情对于 afterSave 上的 Review 对象更有意义:

您的afterSave 需要一些调整。试试这个:

Parse.Cloud.afterSave("Comment", function(request) 
   var Review = Parse.Object.extend("Review");
   var query = new Parse.Query(Review);
   query.equalTo("brewery", request.object.get("brewery"));
   query.find(
     success: function(results) 
     // Find the average from all the brewery reviews
     var total = 0;
     for (var i = 0; i < results.length; i++) 
       var object = results[i];
       total += object.get("rating");
     
     var averageRating = total / results.length;

     var updatedObjects = [];
     for (var i = 0; i < results.length; i++) 
       var object = results[i];
       object.set("average", averageRating);
       updatedObjects.push(object);
     
     Parse.Object.saveAll(updatedObjects);
   , error: function(error) 
     alert("Error: " + error.code + " " + error.message);
   );
);

【讨论】:

我没有啤酒厂对象,我正在使用 breweryDbs API 获取啤酒厂信息。我只是将 Parse 用作存储评论、将啤酒厂保存为收藏夹并提供建议啤酒厂列表的一种方式。有没有办法只用评论对象做我想做的事? 感谢您的帮助! 是的,但是您正在为自己承受很多痛苦。您基本上有两个不相互通信的数据库。更好的解决方案是为您访问的每个啤酒厂添加一个啤酒厂对象到 Parse。它不必拥有 breweryDbs 系统中的所有内容,但可以充当一个很好的中间人,并存储与您的啤酒厂密切相关的信息(如评论平均值)。更干净:) 我现在没有时间退役我的应用程序。我需要一个可以在不改变我的应用程序逻辑的情况下工作的解决方案。另外,我将使用您提出的解决方案存储什么类型的数据? @TylerMiller47 - 您希望将平均评分保存在哪里?我认为应用程序可以基本保持原样,但是将平均评分保存为评论的一部分的想法很奇怪,因为平均值是许多评论的结果。

以上是关于根据评论(对象)解析云代码生成列表的主要内容,如果未能解决你的问题,请参考以下文章

小程序云函数多个函数的同步使用

解析云代码全部保存

解析云代码 GeoPoint

101 在云代码中找不到对象 - 解析服务器

对象没有方法“状态”iOS SDK 和解析云代码

云功能推送通知问题