我有一个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"
}
}
}
])
但是这只返回了最大值,因为它没有该最大值的相应类型信息。有什么办法可以得到理想的结果吗?
答案 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]
]
}
}}
])