使用 MongoDB 返回每个组中具有最大值的文档

dan*_*ane 3 mongodb aggregation-framework

给定一个数据集:

{_id: 0, type: 'banana', amount: 5}
{_id: 1, type: 'banana', amount: 3}
{_id: 2, type: 'apple', amount: 8}
{_id: 3, type: 'apple', amount: 2}
Run Code Online (Sandbox Code Playgroud)

type只获取具有最高值的相同记录的最有效方法是什么amount

预期结果是:

{_id: 0, type: 'banana', amount: 5}
{_id: 2, type: 'apple', amount: 8}
Run Code Online (Sandbox Code Playgroud)

现在我正在这样做,但看起来有点愚蠢:

collection.aggregate([
  { $sort: { 'amount': -1 } },
  { $group: {
     _id: '$type',
     group: {
       $push: '$$ROOT'
     }
   }, {
     $replaceRoot: {
       newRoot: { $arrayElemAt: ["$group", 0] }
     }
   }
])
Run Code Online (Sandbox Code Playgroud)

use*_*814 6

您可以使用以下聚合,$sort金额递减,后跟$first运算符来投影最大金额文档。

$replaceRoot将最大金额文档提升至顶级。

collection.aggregate([
 {$sort:{'amount':-1}}, 
 {$group:{ _id: '$type',group:{$first:'$$ROOT'}}},
 {$replaceRoot:{newRoot:"$group"}}
])
Run Code Online (Sandbox Code Playgroud)