2013-10-14 147 views
0

我已经安装了mongodb-aggregation软件包,但在流星方法中进行聚合时,返回“undefined”。我认为我错过了一些基本的东西。如何进行聚合?任何建议都会很棒。使用meteor-mongo-extensions进行聚合

rate: function(ratingProp){ 
    var user = Meteor.user(); 
    var postId = ratingProp.postId; 
    var post = Posts.findOne({_id: postId}); 
    var rateVal = ratingProp.rateVal; 


    // ensure the user is logged in 
    if (!user) { 
     throw new Meteor.Error(401, "You need to signin to rate."); 
    } 

    // ensure rating has rateVal 
    if (!rateVal){ 
     throw new Meteor.Error(422, "No rating provided."); 
    } 

    // ensure rating has a post 
    if (!post){ 
     throw new Meteor.Error(422, "Rating not associated with a post."); 
    } 

    Ratings.upsert({userId: user._id, postId: postId}, 
        {$set: { rateVal: rateVal }} 
    ); 

    // perform aggregation 
    var avgRate = Ratings.aggregate([ 
     {$match: 
      // hard coded for testing 
      {postId: "D7f3WoDEGW3SqGKW9"} 
     }, 
     {$group: 
      { 
       _id: null, 
       "avgRating":{$avg: "$rateVal"} 
      } 
     } 
    ]); 


    // additional code... 

回答

2

最重要的是,请注意db.ratings.aggregate与流星或流星蒙哥扩展没有关系。 Mongo本身具有原生db.<collection>.aggregate()功能。所以这就是为什么它在shell中工作。

现在为流星。 Meteor使用一个自定义的mongo驱动程序,因此它可以设置Meteor.Collection()等所有不错的反应方面。因此,一些mongo功能尚未实施。

最后meteor-mongo-extensions,这实际上是一个黑客攻击。我还没有确认,我相信这个问题可以在Github issue找到。尝试在流星方法之外的服务器上运行此功能,只是为了确保。

如果您的问题是软件包损坏,您可以尝试Atmosphere上管理聚合的许多软件包之一。 mongodb-server-aggregation看起来很有前途。

+0

谢谢!在方法外移动聚合后,我仍然收到未定义的内容。哪些软件包支持聚合?我只能在大气中找到mongodb-aggregation(我正在使用的那个)和mongodb-server-aggregation。 – Derek

+0

鉴于你的例子,我会尝试使用mongodb-server-aggregation。你可以把这个调用包装在一个流星方法中,就像你的例子一样,它应该工作得很好。要明白,这个功能最终应该被添加到核心Meteor集合中。在此之前的一切都只是一个补丁。 (让我知道这是否为你修复,谢谢!) – Sivli

+0

我试过mongodb-server-aggregation,但是有同样的undefined问题。我有一个破解的地方,我保持一笔数字并计算一个平均值,但它可能容易受到竞争条件的影响。当我完成我正在处理的其他一些事情时,我会尝试回到mongodb-server-aggregation,看看我能否解决问题。 – Derek