我应该使用AutoValue来存储集合的聚合值吗?

时间:2017-02-03 21:18:00

标签: meteor meteor-collection2

我有一个评论集和一个页面集合。评论属于页面。用户可以对评论进行投票,并且我想显示属于页面的评论的所有投票的汇总总和。这样做有什么好办法?

我在考虑将总和保存为页面集合中的AutoValue。是否有办法偶尔触发重新计算AutoValue?我不需要实时更新总和,每5分钟就足够了。

或者这是一个坏主意?在模板中使用ReactiveVar进行计算会更好吗?

编辑:真的没有太多关于设置的特别之处。只是一个带有数字'votes'属性的评论集合和一个带有数字autovalue'得分'的页面集合,应该计算投票数。 页面:

Collections.Pages = new Mongo.Collection("pages");

var PageSchema = new SimpleSchema({
    name: {
        type: String,
        min: 1
    },
    score: {
        type: Number,
        autoValue: function (doc) {
                var maxValue = 1;
                Collections.Comments.find({ pageId: doc.pageId }).map(function(mapDoc){
                    maxValue += mapDoc.votes;
                });
                return maxValue;
        }
    },

评论:

Collections.Comments = new Mongo.Collection("comments");

var CommentSchema = new SimpleSchema({
    pageId: {
        type: String
    },
    name: {
        type: String,
        optional: true
    },
    votes: {
        type: Number,
        label: 'Total Votes',
        defaultValue: 0
    },

2 个答案:

答案 0 :(得分:2)

定期/定时重新计算的另一种方法可能是简单地重新计算一个集合中的值以响应另一个集合中的更改。你说你不需要实时,但我不会想象你是否真的想到它。

我遇到了类似的挑战并使用了Meteor Collection Hooks包(参见https://github.com/matb33/meteor-collection-hooks)。

示例:

Collection.comments.after.update(function(userId, doc) { // make update to aggregated value in Collections.pages });

答案 1 :(得分:0)

我做了类似的事情:我有新闻项目和评论,我想跟踪每个新闻项目的评论数量,而不必发布所有评论。

我选择给新闻一个commentCount字段。我有添加和删除注释的方法,作为该处理的一部分,我查找了相关的新闻项目并增加或减少了它的计数。

您使用架构解决方案找到的是,没有明确的方法来触发autoValue。 (这是autoValue的有趣用法,顺便说一下,我必须牢记这一点以备将来使用)。

所以我认为你留下了这些选择:

  1. 为投票创建upvote / downvote方法。在方法处理程序中,对总投票进行计算并将更新后的值与post一起存储。这与我对新闻/评论所做的类似。

  2. 正如David建议的那样,使用集合钩子做类似于#1的事情。虽然我确实使用了收集钩,但通常情况下,当我没有清楚地了解我想要做的事情时,它更像是一个笼子,或者是处理过的东西我不喜欢和#39完全控制。

  3. 在发布中处理它。当您发布页面时,还要查找投票计数,并简单地动态添加到发布对象。请注意,当投票改变时,这不会重新发布页面,因此您将失去反应;你确实表示你可以定期更新。

  4. 获取更新将有点棘手,因为您必须强制发布者再次运行。例如通过取消订阅和重新订阅。

    根据我对你的问题的理解,我认为他们按照所提出的顺序喜欢它们。 #3感觉最不可行,但我提到它以防它适合你正在做的其他事情。