2013-04-29 59 views
2

我在我的應用程序中有兩個模型:Item和Comment。一個Item可以有很多註釋,並且一個Comment實例包含一個對帶有鍵'comment'的Item實例的引用來跟蹤關係。如何將評論計數填充到項目列表?

現在,當用戶請求特定的URL時,我必須發送所有項目的JSON列表及其評論計數。

function(req, res){ 
    return Item.find() 
    .exec(function(err, items) { 
     return res.send(items); 
    }); 
}; 

我不知道如何「填充」評論計數的項目。這似乎是一個普遍的問題,我傾向於認爲應該有一些更好的方式來完成這項工作,而不是蠻橫的。

所以請分享你的想法。你將如何「填充」項目的評論計數?

回答

0

我沒有在這個問題上的一些研究,並與下面的結果出來了。首先,MongoDB的文檔suggest

一般情況下,使用嵌入式數據模型時:

  • 你有「包含」實體之間的關係。
  • 您有一對多關係,其中「許多」對象總是與其父文檔的上下文一起出現或在其中查看。

所以在我的情況下,它更有道理,如果Comment s的嵌入Item秒,而不是獨立存在的。

儘管如此,我很好奇在不改變數據模型的情況下了解解決方案。由於mentioned在MongoDB文檔:

引用提供了比嵌入更多的靈活性;然而,爲了解決參考文獻 ,客戶端應用程序必須發出後續 查詢。換句話說,使用引用需要更多往返 服務器。

由於多次往返現在是猶太,我想出了以下解決方案:

var showList = function(req, res){ 

    // first DB roundtrip: fetch all items 
    return Item.find() 
     .exec(function(err, items) { 
      // second DB roundtrip: fetch comment counts grouped by item ids 
      Comment.aggregate({ 
       $group: { 
        _id: '$item', 
        count: { 
         $sum: 1 
        } 
       } 
      }, function(err, agg){ 
       // iterate over comment count groups (yes, that little dash is underscore.js) 
       _.each(agg, function(itr){ 
        // for each aggregated group, search for corresponding item and put commentCount in it 
        var item = _.find(items, function(item){ 
         return item._id.toString() == itr._id.toString(); 
        }); 
        if (item) { 
         item.set('commentCount', itr.count); 
        } 
       }); 
       // send items to the client in JSON format 
       return res.send(items); 
      })   
     }); 

}; 

同意?不同意?請賜教你的意見!

如果你有更好的答案,請在這裏發帖,如果我覺得它值得的話,我會接受它。

0

檢查MongoDB文檔並查找方法findAndModify() - 通過它您可以自動更新文檔,例如:添加評論並同時增加文檔計數器。

findAndModify

的findAndModify命令自動修改,並返回一個單一的文件。默認情況下,返回的文檔不包含對更新所做的修改。要通過對更新所做的修改返回文檔,請使用新選項。

使用update選項,以更新運營商$inc用於計數器,和$addToSet用於將實際註釋以註釋的嵌入式陣列。

db.runCommand(
      { 
       findAndModify: "item", 
       query: { name: "MyItem", state: "active", rating: { $gt: 10 } }, 
       sort: { rating: 1 }, 
       update: { $inc: { commentCount: 1 }, 
         $addToSet: {comments: new_comment} } 
      } 
      ) 

參見:

MongoDB: findAndModify

MongoDB: Update Operators

+0

感謝您的回答,@Tilo。您的技術建議我在Item Item模型中添加一個新的參數「commmentCount」,並在每個新評論添加到Item時更新它。雖然這種方法看起來很實用,但我不知道是否有一種方法可以即時計算commentCount,並將其附加到Item模型,而無需存儲/更新它。 – craftsman 2013-04-29 13:01:10

+0

當然,你也可以得到'comments'數組並且使用它的大小 – Tilo 2013-04-29 16:06:46

+0

是的,但是你看到我需要傳遞一個數組項,每個項都有自己的commentCount。有沒有辦法做到這一點? – craftsman 2013-04-29 23:33:22

相關問題