Mongodb получить рейтинг пользователей на основе их вкладов - PullRequest
0 голосов
/ 23 марта 2020

Вот примерное представление моей коллекции mongodb:

{
   user: ID1,
   type: 'redemption,
   amount: 200
},
{
   user: ID2,
   type: 'redemption,
   amount: 1000
},
{
   user: ID1,
   type: 'redemption',
   amount: 300
},
{
   user: ID3,
   type: 'redemption',
   amount: 3000
}

Поле "type" является переменным (выкуп, передача и т. Д. c ...). То, с чем я борюсь, это найти то, что пользователи выкупили наибольшее количество баллов. В данном конкретном случае, ID3 является лучшим получателем с 3000 баллов, ID2 является вторым (1000), а ID1 является третьим (300 + 200 = 500).

Какие пн go операции я должен искать на?

ps Я вроде как туда попал:

aggregate([ 
            { 
                $group : { 
                    _id : "$user",
                    redeemedTotal: { $sum: "$amount" }
                } 
            } 
        ])

Но это $ sum не только тип: 'выкуп', но и другие типы сумм. Как мне сузить это до просто type: 'redemption'

pps Я думаю, я получил это:

 .aggregate([ 
        {
            $match: { "type": "redemption" }
        },
        { 
            $group : { 
                _id : "$sender",
                redeemedTotal: { $sum: "$amount" }
            } 
        } 
    ])

1 Ответ

0 голосов
/ 23 марта 2020

Вам необходимо использовать $cond оператор

db.collection.aggregate([
  {
    $group: {
      _id: "$user",
      redeemedTotal: {
        $sum: {
          $cond: [
            {
              $eq: ["$type", "redemption"]
            },
            "$amount", //true
            0 //false
          ]
        }
      }
    }
  }
])

MongoPlayground

Альтернатива

Группировка более чем в 1 поле

db.collection.aggregate([
  {
    $group: {
      _id: {
        user: "$user",
        type: "$type"
      },
      redeemedTotal: {
        $sum: "$amount"
      }
    }
  }
])

MongoPlayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...