首页 > 解决方案 > Mongodb 根据贡献度获取用户排名

问题描述

这是我的 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
}

“类型”字段是可变的(赎回、转移等)。我正在努力寻找用户兑换最多积分的内容。在这种特殊情况下,ID3 是拥有 3000 点积分的最高兑换者,ID2 是第二名(1000),ID1 是第三名(300+200=500)。

我应该查看哪些 Mongo 操作?

ps 我快到了:

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

但它 $sum不仅输入:'redemption',还输入其他类型的金额。我如何将其缩小到仅type: 'redemption'

pps 我想我明白了:

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

标签: node.jsmongodbmongoose

解决方案


您需要使用$cond运算符

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

Mongo游乐场

选择

Groupby 超过 1 个字段

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

Mongo游乐场


推荐阅读