MongoDB:聚合,由几个字段组成

我有一个收集文件的结构

{ type: 'a', date: '2014-01-04' }, { type: 'b', date: '2014-01-04' }, { type: 'b', date: '2014-01-04 }, { type: 'c', date: '2014-01-03' }, { type: 'a', date: '2014-01-03' } 

我想通过date和types来聚合这些数据(按日​​期分组并按types计数):

 { date: '2014-01-04': { 'a': 1, 'b': 2 }, date: '2014-01'03': { 'a': 1, 'c': 1 } } 

我有这样的聚合函数

 db.items.aggregate([ { $match: { user: user }, }, { $group: { _id: {date: '$date'}, count: {$sum: 1}, services: {$push: '$type'}} } ], function (err, results) { 

但是这样做我仍然需要通过服务来reduce结果。

这可以通过一个聚合查询来完成吗?

通过假设你有固定数量的types,你可以解决它如下:

 db.collection.aggregate( {$group : {_id : "$date", a:{$sum:{$cond:[{$eq:['$type','a']},1,0]}}, b:{$sum:{$cond:[{$eq:['$type','b']},1,0]}}, c:{$sum:{$cond:[{$eq:['$type','c']},1,0]}} }}, {$project : {_id : 0, date : "$_id", a: "$a", b : "$b", c : "$c"}} ) 

你当然可以由多个领域组成:

 { $group: { _id: { date: '$date', services: '$services' } } 

但这不是你想要的。 你不能每个人都轻易地将数据转换成密钥,除非你可以手工完成。 以下查询将是一个选项:

 db.test.aggregate( [ { $group: { '_id' : { date: '$date' }, a: { $sum: { $cond: [ { $eq: [ '$type', 'a' ] }, 1, 0 ] } }, b: { $sum: { $cond: [ { $eq: [ '$type', 'b' ] }, 1, 0 ] } }, c: { $sum: { $cond: [ { $eq: [ '$type', 'c' ] }, 1, 0 ] } }, } }, { $project: { _id: 0, date: '$_id.date', a: '$a', b: '$b', c: '$c', } } ] ); 

您将需要为每个新types手动添加一行。