2013-10-14 335 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