2013-04-18 3 views
9

さまざまなサイズの配列を持つレコードの数のリストを取得しようとしています。これまで使用してMongoDBアグリゲーションフレームワークを使用して配列サイズのヒストグラムを取得する最速の方法

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

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

       Array Size 

だから生の文書はこのような何かを見て:私は、私はこのようなヒストグラムを構築することができますので、すべてのレコードの配列サイズの分布を取得したいです集約フレームワークやヘルプhereのいくつかは、私が

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

を作ってみた。これは私が望む結果を与えるようで、それほど速くはありません。私は2つのグループコールが必要ないかもしれないこのようなことができるかどうか疑問に思います。構文はここで間違っている、しかし、私がやろうとしていると、最初の_idフィールドのカウント値置かれる:

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

最初のグループのカウントを終了するまで、結果のカウント/グループ化を開始できないため、これを1回のパスで行う方法はありません。 MongoDBのどのバージョンを使用していますか?ちなみに –

+0

、どれくらいかかりますか? –

+0

私はそうかもしれないと思っています(ネスティングは許可されておらず、連鎖のみです)。それはあまりにも悪くない約4秒かかるですが、私はサブ秒を望んでいた。私は今、クエリを調整する代わりに私のデータを微調整することができます。 – Scott

答えて

5

今すぐ2.6が出ていることを、集約フレームワークは、あなたが$projectできるようになりますnew array operator $sizeをサポートしています巻き戻しやグループ分けをしなくても配列サイズを変更することができます。

db.sitedata.aggregate([{ $project:{ 'count': { '$size':'$hubs'} } }, 
         { $group : {_id:'$count', count:{$sum:1} } }, 
         { $sort : { _id: 1 } } ]) 
関連する問題