Mongodb 返回分组数据中的最大值

Mongodb 返回分组数据中的最大值,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我根据一些条件对一些数据进行了分组,得到了预期的结果。但是,我只想返回每个池中编号最高的项目。如果我只想得到最高的一个,我可以添加.sort({correctBets:-1})。将(1)限制到最后,但现在每个池中都需要一个。如果一个池中有两个或更多的正确赌注是相同的,我想退还所有这些物品。我该怎么做 const coupon = await CouponModel.aggregate([ { $match: { eventId: { $in: eventIds

我根据一些条件对一些数据进行了分组,得到了预期的结果。但是,我只想返回每个
池中编号最高的项目。如果我只想得到最高的一个,我可以添加
.sort({correctBets:-1})。将(1)
限制到最后,但现在每个池中都需要一个。如果一个池中有两个或更多的正确赌注是相同的,我想退还所有这些物品。我该怎么做

const coupon = await CouponModel.aggregate([
    {
      $match: {
        eventId: { $in: eventIds },
      },
    },
    {
      $group: {
        _id: {
          userId: '$userId',
          pool: '$pool',
        },
        correctBets: {
          $sum: '$correctBets',
        },
      },
    },
  ])
这是我从聚合返回的数据

[ 
  { _id: { userId: '5df344a1372f345308dac12a', pool: 'foo' },
    correctBets: 9 },
  { _id: { userId: '5dfb2db245011a390fec4f7d', pool: 'bar' },
    correctBets: 6 },
  { _id: { userId: '5df344a1372f345308dac12a', pool: 'bar' },
    correctBets: 5 },
  { _id: { userId: '5dfb2db245011a390fec4f7d', pool: 'foo' },
    correctBets: 11 } 
]
我的预期结果应该是这样的

[
  { _id: { userId: '5dfb2db245011a390fec4f7d', pool: 'foo' },
    correctBets: 11 },
  { _id: { userId: '5dfb2db245011a390fec4f7d', pool: 'bar' },
    correctBets: 6 }
]

编辑:建议的重复问题不处理每个“键”的最大值,因为在我的例子中是两个池。Foo和bar.

您需要添加额外的阶段。我们需要为每个
字段计算max
correctBets
,并将文档存储到时态
数据
字段中。然后,我们展平
数据
,并检查数据中存储的任何文档是否具有相同的
最大值更正

{
    $group: {
      _id: {
        pool: "$_id.pool"
      },
      data: {
        $push: "$$ROOT"
      },
      correctBets: {
        $max: "$correctBets"
      }
    }
},
{
    $unwind: "$data"
},
{
    $match: {
      $expr: {
        $eq: [
          "$correctBets",
          "$data.correctBets"
        ]
      }
    }
  },
{
    $replaceRoot: {
      newRoot: "$data"
    }
}

这是否回答了您的问题?不幸的是,它只返回一个池中的最高值。我需要最高的摊位。下面的答案确实有效。无论如何谢谢你!谢谢但是,如果同一池中的两个用户ID具有相同数量的correctBets,则结果仅包括其中一个。如果他们两人都打成平局,我想让他们一起去。@GameAtrix请再检查一遍。现在他们都在操场上了吗?是的,现在它按预期工作了。非常感谢你!