使用MongoDB聚合在数字字段上返回具有最大值的文档

时间:2014-11-07 22:29:56

标签: mongodb mongoose aggregation-framework

如果我有一堆文件,例如

{
  _id: mongoId,
  subcatId: mongoId,
  viewCount: 2
}

_id是唯一的,但subcatId不是。

如果我想返回每个subcatId具有最高viewCount的每个文档,我将如何使用Mongoose / MongoDB聚合?

1 个答案:

答案 0 :(得分:3)

你可以这样做:

db.test.aggregate([
  // Sort the docs by viewCount descending so that the highest ones come first
  {$sort: {viewCount: -1}},
  // Group by subcatId and take the first doc from each group
  {$group: {_id: '$subcatId', doc: {$first: '$$ROOT'}}}
])

在{2.6}中添加了$$ROOT系统变量,表示在管道中该阶段正在处理的整个文档。所有系统变量都以$$前缀引用。

对于较旧版本的MongoDB,您需要将$group所需的每个字段单独添加:

db.test.aggregate([
  {$sort: {viewCount: -1}},
  {$group: {
    _id: '$subcatId', 
    doc_id: {$first: '$_id'},
    viewCount: {$first: '$viewCount'}
  }}
])