2013-08-19 71 views
0

我的收藏電影裏有18個文件。每部電影例如:如何與流星/蒙戈相加數組

{ 
    title: "Test Movie 2", 
    date: [20130808, 20130606], 
    score: [ {"pete": 1, "mary": 1, "simon": 1, "pat": 2, "mike": 0}, 
      {"pete": 5, "mary": 5, "simon": 5, "pat": 0, "mike": 5}] 
} 

現在,我要顯示在客戶端上的數組「分數」第二個文檔的日期和金額,如:

<div class="details"> 
    Test Movie 2: 20 points 20130606 
</div> 

有別人的想法我怎麼能做到這一點?

+0

可能是這個http://stackoverflow.com/questions/12162681/mongodb-2-1-aggregate-framework-sum-of-array-elements-matching-a-name將幫助你 – Freak

回答

1

您可以使用變換,最好是定義每個文檔的名稱並明確定義點作爲名稱/值對,而不是將點作爲每個人名稱的值。

但這應該工作:

Movies.find({}, {transform: function(doc) { 
    var total_points = 0; 
    var people = doc.score[1]; //Second in array 
    for(point in people) { 
     total_points += people[point] 
    } 

    doc.points = total_points; 
    return doc; 
}}); 

這應該給你:

{ 
    title: "Test Movie 2", 
    points: 20, 
    date: [20130808, 20130606], 
    score: [ {"pete": 1, "mary": 1, "simon": 1, "pat": 2, "mike": 0}, 
      {"pete": 5, "mary": 5, "simon": 5, "pat": 0, "mike": 5}] 
} 
+0

我已經決定這種方法,但它不起作用。我已將代碼複製到JavaScript文件中,但不幸的是,它不會更改我的文檔。我會繼續努力... – Sebastian

+0

哦,對不起,我忘了在變換中返回「doc」。嘗試使用上面的更新代碼 – Akshat

0

蒙戈可能可以做到這一點顧左右而言他,但你不會是能夠直接通過查詢做到這一點由於Mongo livedata包的限制,從0.6.5開始收集。聚合框架也是禁止的,它們似乎拉開了允許直接訪問Mongo的'隱藏'方法。

那麼你的選擇是:

  • 使用變換按Akshat的答案 -

  • 總結手動兩全其美的客戶端在模板幫手。我推薦使用來自Meteor的'免費'的_.js(這可能會改變,但你可以隨時手動提取庫)。 var sum = _.reduce(score [1],function(memo,num){return memo + num;},0);

    (我沒有測試上述內容,但它應該會將您發送到正確的軌道上)。

  • 聚集上游,在插入/更新/刪除期間,可能通過觀察集合上的更改並「喂入」您插入到同一個集合或集合中的元素的sum()。

你使用哪種方法取決於那裏的表現您最重視,平時做骨料,然後插入傾向於避免以後的問題,並減輕負荷。

祝你好運,讓我們知道你是如何得到。