2016-12-24 46 views
0

提取领域我有一个MongoDB的集合genre_count作为MongoDB的 - 如何与最大值

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

我需要提取的IE用户1最大计数每个用户的流派,以最大计数体裁是喜剧伯爵 5.我尝试使用几种方法为:

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

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

我认为这会工作,但它所以基本上retur返回用户对每个流派的计数把我所有的记录都记录下来。

然后我尝试另一种解决方案,它在部分工作:

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

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

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

回答

1

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

从那里你需要在你的$project阶段使用$map运营商返回一个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] 
       ] 
      } 
     }} 
    ]) 
1

我想你可以用这个总量:

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

它工作,对我来说很好,但我有一个问题。无论如何,我可以提取具有相同最大计数的所有值,即如果多个流派具有相同的最大计数,它只返回一个 – scrpaingnoob

+0

@scrpaingnoob我试图回答你的第二个问题。在当前的答案中,假设是在排序后选择最后一个流派(它保存最大值),并获得所有相应的值。我也尝试解释这种方法。 – Rahul