MongoDB - 如何提取最大值为

时间:2016-12-24 06:36:04

标签: mongodb mongodb-query

我有一个MongoDb集合genre_count

user | genre         | count
-----+---------------+-------
1    | Western       | 2
1    | Adventure     | 1
1    | Comedy        | 5
2    | Western       | 3
2    | Thriller      | 1
2    | Romance       | 2

我需要为每个用户提取最大数量的类型,即对于用户1,具有最大数量的类型是喜剧计数 5.我尝试使用几个方式如下:

db.genre_count.aggregate([
  {
  $group:{
     _id:{

        user:"$user",
        genre:"$genre"
     },
     max_val:{
         $max: "$count"
     }
   }
 }
])

我认为这样可行,但它返回了每个类型的用户数,所以基本上它返回了我所有的记录。

然后我尝试了另一个部分工作的解决方案:

db.genre_count.aggregate([
  {
  $group:{
     _id:{

        user:"$user"
     },
     max_val:{
         $max: "$count"
     }
   }
 }
])

但是这只返回了最大值,因为它没有该最大值的相应类型信息。有什么办法可以得到理想的结果吗?

2 个答案:

答案 0 :(得分:1)

我认为你可以使用这个聚合:

db.genre_count.aggregate([
{
    $sort: {user:1, count:1}
},
{
    $group: 
    { 
        _id: "$user", 
        maxCount: {$max: "$count"}, 
        genre: {$last: "$genre"} 
    }
}])

答案 1 :(得分:1)

要返回最大计数和流派列表,您需要使用组阶段中的$max为每个组返回最大“计数”,然后使用$push累加器运算符返回列表每组的“类型名称”和“计数”。

从那里你需要使用$map阶段的$project运算符返回genre_names列表以及最大计数。此处的$cond用于将每个流派计数与最大值进行比较。

db.genre_count.aggregate([
        { '$group': {
            '_id': '$user', 
            'maxCount': { '$max': '$count' }, 
            'genres': { 
                '$push': {
                    'name': '$genre', 
                    'count': '$count' 
                }
            }
        }}, 
        { '$project': { 
            'maxCount': 1, 
            'genres': { 
                '$setDifference': [
                    { '$map': {
                        'input': '$genres', 
                        'as': 'genre', 
                        'in': {
                            '$cond': [
                                { '$eq': [ '$$genre.count', '$maxCount' ] }, 
                                '$$genre.name', 
                                false
                            ]
                        }
                    }}, 
                    [false]
                ]
            }
        }}
    ])