2013-08-19 70 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()。

你使用哪种方法取决于那里的表现您最重视,平时做骨料,然后插入倾向于避免以后的问题,并减轻负荷。

祝你好运,让我们知道你是如何得到。