2013-04-18 62 views
9

我試圖獲得具有不同大小數組的記錄數的列表。我想獲得數組大小分佈的所有記錄,所以我可以建立這樣的直方圖:到目前爲止使用使用MongoDB聚合框架獲取數組大小的直方圖的最快方法

{hubs : [{stuff:0, id:6}, {stuff:1"}, .... ]} 
{hubs : [{stuff:0, id:6}]}` 

  | * 
      | * 
documents | *   * 
      | * *  * 
      |_*__*__*___*__*___ 
      2 5 6 23 47 

       Array Size 

因此RAW文件是這個樣子聚合框架和一些幫助here我拿出

db.sitedata.aggregate([{ $unwind:'$hubs'}, 
         { $group : {_id:'$_id', count:{$sum:1}}}, 
         { $group : {_id:'$count', count:{$sum:1}}}, 
         { $sort : {_id: 1}}]) 

這似乎給我我想要的結果,但速度不是很快。我想知道是否有這樣的事情可以做,這可能不需要兩個組呼。語法是錯在這裏,但我想要做的就是把在第一場_id的計數值:

db.sitedata.aggregate([{ $unwind:'$hubs'}, 
         { $group : {_id:{$count:$hubs}, count:1}}, 
         { $sort : { _id: 1 }}]) 
+0

沒有辦法一次完成此操作,因爲在完成第一個分組計數之前,您無法開始計算/分組結果。你使用的是什麼版本的MongoDB?順便提一下, –

+0

,需要多長時間? –

+0

好的,我懷疑可能是這樣(嵌套不允許,只有鏈接)。這需要大約4秒鐘,這並不算太壞,但我希望獲得亞軍。我可以調整我的數據,而不是現在調整查詢。 – Scott

回答

5

現在2.6已經出來了,聚集框架支持new array operator $size,這將讓你$project的數組大小,無需展開和重新組合。

db.sitedata.aggregate([{ $project:{ 'count': { '$size':'$hubs'} } }, 
         { $group : {_id:'$count', count:{$sum:1} } }, 
         { $sort : { _id: 1 } } ])