【问题标题】:How to sum an array with meteor/mongo如何用流星/蒙戈对数组求和
【发布时间】:2013-08-21 05:16:57
【问题描述】:

我的收藏影片中有 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>

有人知道我该怎么做吗?

【问题讨论】:

标签: arrays mongodb meteor sum database


【解决方案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}]
}

【讨论】:

  • 我已经决定采用这种方法,但它不起作用。我已将代码复制到我的 JavaScript 文件中,但不幸的是它不会更改我的文档。我会继续努力...
  • 抱歉,我忘记在转换中使用 return doc。尝试使用上面的更新代码
【解决方案2】:

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

所以你的选择是:

  • 按照 Akshat 的回答使用变换 - 两全其美

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多