Вернуть наибольшее число в сгруппированных данных - PullRequest
0 голосов
/ 29 января 2020

Я сгруппировал некоторые данные по некоторым условиям и получил ожидаемый результат. Тем не менее, я хотел бы только вернуть товар с наибольшим числом в каждом pool. Если бы я только хотел получить самый высокий, я бы мог добавить .sort({ correctBets: -1 }).limit(1) в конец, но теперь мне нужен один в каждом пуле. И если два или более correctBets одинаковы в одном пуле, я хотел бы вернуть все эти элементы. Как мне это сделать?

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 }
]

Редактировать: предложенный повторяющийся вопрос не обрабатывает максимальные значения для каждого «ключа», так как в моем случае это два пула. Фу и бар.

1 Ответ

1 голос
/ 29 января 2020

Вам необходимо добавить дополнительные этапы. Нам нужно вычислить max correctBets для каждого поля pool и сохранить документы во временном поле data. Затем мы выравниваем data и проверяем, имеет ли какой-либо документ, хранящийся внутри данных, тот же correctBets с максимальным значением.

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

MongoPlayground

...