如何填充评论计数到一个项目列表?

我有两个模型在我的应用程序:项目和评论。 一个Item可以有很多注释,而一个Comment实例包含对一个Item实例的引用,并带有键“comment”来跟踪关系。

现在,当用户请求特定的URL时,我必须发送所有项目的JSON列表以及它们的评论计数。

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

我不知道如何“填充”评论计数的项目。 这似乎是一个普遍的问题,我倾向于认为应该有一个更好的方式来做这个工作比蛮力。

所以请分享你的想法。 你如何“填充”评论计数的项目?

检查MongoDB文档并查找方法findAndModify() – 使用它可以自动更新文档,例如添加注释并同时增加文档计数器。

findAndModify

findAndModify命令自动修改并返回单个文档。 默认情况下,返回的文档不包括对更新所做的修改。 要使用更新所做的修改来返回文档,请使用新选项。

使用update选项,计数器使用更新操作符$inc ,使用$addToSet将实际注释添加到embedded的注释数组中。

  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:更新操作符

我在这个问题上做了一些研究,得出了如下的结果。 首先,MongoDB文档build议 :

通常,在以下情况下使用embedded式数据模型

  • 你有“包含”实体之间的关系。
  • 您有一对多的关系,其中“许多”对象总是与其父文档的上下文一起出现或被查看。

所以在我的情况下,如果Comment被embedded到Item ,而不是独立存在,则更有意义。

不过,我很想知道解决scheme,而不改变我的数据模型。 正如在MongoDB文档中提到的 :

引用提供比embedded更多的灵活性; 但是,为了解决引用问题,客户端应用程序必须发出后续查询。 换句话说,使用引用需要更多的往返服务器。

由于现在多次往返犹太教,我提出了以下解决scheme:

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

同意? 不同意? 请赐教你的意见!

如果你有更好的答案,请张贴在这里,如果我觉得值得的话,我会接受。