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}]
}

现在,我想在客户端的数组 'score' 中显示第二个文档的日期和总和,例如:

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

有人知道我该怎么做吗?

4

2 回答 2

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}]
}
于 2013-08-19T12:27:34.483 回答
0

Mongo 可能会直接执行此操作,但由于 Mongo livedata 包自 0.6.5 起的限制,您将无法通过查询集合直接执行此操作。聚合框架也是禁止使用的,他们似乎已经取消了允许直接访问 Mongo 的“隐藏”方法。

所以你的选择是:

  • 根据 Akshat 的回答使用变换 - 两全其美

  • 在模板助手中的客户端中手动聚合。我建议使用 Meteor 附带的“免费”的 _.js(这可能会改变,但您以后可以随时手动拉入库)。

    var sum = _.reduce(score[1], function(memo, num){ return memo + num; }, 0);

    (我没有测试上述内容,但它应该会让你走上正确的道路)。

  • 在插入/更新/删除期间聚合上游,可能通过观察集合的变化并“输入”您在同一集合或聚合集合中插入的元素的 sum()。

您使用哪种方法取决于性能对您最重要的地方,通常在插入之前进行聚合往往可以避免以后出现问题并减轻负载。

祝你好运,让我们知道你的进展如何。

于 2013-08-19T12:28:59.130 回答