2017-02-03 125 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感覺最不可行,但我提到它以防萬一它適合於你正在做的其他事情。

相關問題