2017-02-03 90 views
0

我有一个评论集合和一个Page集合。评论属于页面。用户可以提出评论,并且我想要显示属于页面的评论的所有投票的总计总和。什么是这样做的好方法?我应该使用AutoValue来存储集合的集合值吗?

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

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

编辑:真的,没有什么特别的设置。只需一个带有数字“投票”属性的评论集合和一个带有数字自动值“分数”的网页集合,该集合应计算投票数。 的网页:

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 
    }, 
+0

你可以发布模式和发布者的代码吗? – zim

+0

请参阅编辑。发布者没有什么值得发布的内容,因为它现在只是简单地返回一篇文章及其评论。 – Cos

回答

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 });

+0

我最终使用观察者来捕捉集合更改(不添加任何新的包)。谢谢你的提示! – Cos

0

我做类似的事情:我有新闻项目进行评论,我想跟踪每则新闻评论的数量W/O不必发布所有的评论。

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

您在架构解决方案中发现的是,没有明确的方法触发autoValue。 (这是一个有趣的autoValue用法,顺便说一句,我将不得不牢记未来的使用)。

,所以我想你留下了这些选择:

  1. 创造票给予好评/ downvote方法。在方法处理程序中,对总票数进行计算并将更新后的值与帖子一起存储。这与我对新闻/评论所做的相似。

  2. 正如David所建议的那样,使用集合钩子来执行类似于#1的操作。尽管我确实使用了集合钩子,但通常当我没有明确的钩子进入我想做的事情时,它更多的是一种流行的东西,或者是处理掉我不完全控制的东西。

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

得到更新会有点棘手,因为你将不得不强迫发布者再次运行。例如通过取消订阅和重新订阅。

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

相关问题