2016-12-24 26 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