我正在尝试对文档集合执行某些聚合。文件如下:
{name: "Sara", brandId: 1, count: 2 day:1/6/2014}//day value is ISODate
{name: "Sally", brandId: 1, count: 5 day:1/7/2014}
{name: "Mike", brandId: 1, count: 2, day: 1/8/2014}
{name: "Bob", brandId: 1, count: 4 day: 1/8/2014}
{name: "Joe", brandId: 1, count: 5 day:1/8/2014}
我要做的是获取所有'count'值的总和。然后我想按日期范围对文档进行分组,并获得第二个分组的总和。所以我想做这样的事情:
db.people.aggregate(
{ $match : { BrandId : 4 } },
{ $group : {
_id : "$brandId",
TotalCount : { $sum : "$count" } //get the sum of all document 'count'
}},
{$match: {
'Day': { $gte: new Date(2014, 0, 6),
$lte: new Date(2014, 0, 8)}
}},
{ $group : {
_id : "$BrandId",
countInTimeRange : { $sum : "$count" } //get the sum of 'count' within time range
}}
)
所以我希望获得所有匹配文档的计数,然后按日期范围过滤它们,并获得过滤后的日期范围匹配文档的总和。 这可能吗?
谢谢!
答案 0 :(得分:3)
我能够在$ group操作中使用$ cond找到解决方案。
db.project.aggregate(
{ $match : { brandId : 4 } },
{ $project : {
_id : 0,
brandId : 1,
count : 1,
day : 1}
},
{ $group : {
_id : "$brand",
TotalCount : { $sum : "$count" },
countInTimeRange : {$sum: { $cond: [ { $and: [{$gte: [ "$day", new Date(2014, 0, 6) ] }, {$lte: [ "$day", new Date(2014, 0, 8) ] }] }, "$count", 0 ] }}
}}
)