2013-12-14 135 views
1

我有點卡在MongoDB的聚合框架中,看起來很簡單。Mongo Aggregation分組子文檔

想象一下,你有文件,將是這樣的:

[ 
    { a: 1, b: 2 }, 
    { a: 1, b: 3 }, 
    { a: 5, b: 6 } 
] 
  • 你怎麼能組通過現場a文件,然後由另一場重組子文檔,說b同時還計算總數每一步的文件?

在我們的例子中,結果看起來是下面的輸出文件:

{ 
    results: [ 
     { 
      _id: { 
       a: 1 
      }, 
      sum_a: 2, 
      doc_a: [ 
       { 
        _id: { 
         b: 2 
        }, 
        sum_b: 1 
       }, 
       { 
        _id: { 
         b: 3 
        }, 
        sum_b: 1 
       } 
      ] 
     }, 
     { 
      _id: { 
       a: 5 
      }, 
      sum_a: 1, 
      doc_a: [ 
       { 
        _id: { 
         b: 6 
        }, 
        sum_b: 1 
       } 
      ] 
     } 
    ] 
} 

我試過這樣的事情:

printjson(db.getSiblingDB('mydb').mycollection.aggregate([ 
    { 
     $project: { 
      a: 1, 
      b: 1 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       a: '$a' 
      }, 
      sum_a: { 
       $sum: 1 
      }, 
      b: { 
       $first: '$b' 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       b: '$b' 
      }, 
      sum_b: { 
       $sum: 1 
      } 
     } 
    }, 
    { 
     $sort: { 
      sum_a: 1 
     } 
    } 
])); 

但在我做出了不同的測試,它使覆蓋以前的小組階段結果,錯誤地計算總和......等等。

所以我真的不知道如何解決這個問題。

回答

3

如果您將主字段('a')和子字段('b')組合在一起,然後僅對'a'進行分組(將第一步的計數相加)並將'b'推入數組中從第一步複製計數),它應該會產生你所需要的:

{ 
    $group : { 
     _id : { 
      a : '$a', 
      b : '$b' 
     }, 
     count : { 
      $sum : 1 
     } 
    } 
},{ 
    $group : { 
     _id : { 
      a : '$_id.a' 
     }, 
     count_a : {$sum: '$count'}, 
     doc_a : { 
      $push : { 
       b : '$_id.b', 
       count_b : '$count' 
      } 
     } 
    } 
}