具有group by多列的distinct、sum函数的Mongodb计数

具有group by多列的distinct、sum函数的Mongodb计数,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个事务表,由员工的假期填充。在mongodb中,我需要以下sql场景的帮助 从中选择员工、月份、年份、计数(不同(假日类型)、总和(小时) 按员工、月份、年份划分的交易组 几周前我就开始使用mongodb了。我通过is stack overflow post得到了部分答案,现在我想添加sum函数 任何指导都会非常有用,以下是以表格形式显示的数据示例: Employee date holiday_type hours 1 1/1/2014 1

我有一个事务表,由员工的假期填充。在mongodb中,我需要以下sql场景的帮助

从中选择员工、月份、年份、计数(不同(假日类型)、总和(小时) 按员工、月份、年份划分的交易组

几周前我就开始使用mongodb了。我通过is stack overflow post得到了部分答案,现在我想添加sum函数

任何指导都会非常有用,以下是以表格形式显示的数据示例:

Employee    date      holiday_type  hours
1           1/1/2014  1             8 
1           1/5/2014  2             7 
1           2/15/2014 1             8 
1           3/15/2014 3             16 
11          1/1/2014  1             8 
11          1/5/2014  1             6 
11          2/15/2014 3             8 
11          3/15/2014 3             8
因此,“小时”实际上是文档中的一个字段(属性)。因此,从前面的答案中,您只需将双重分组抽象如下:

db.transactions.aggregate([
{“$group”:{
“_id”:{
“雇员”:“$employee”,
“月”:{“$Month”:“$date”},
“年”:{“$Year”:“$date”},
“假日类型”:“$假日类型”
},
“小时”:{“$sum”:“$hours”}
}},
{“$组”:{
“_id”:{
“雇员”:“$\u id.employee”,
“月”:“$\u id.Month”,
“年”:“$\u id.Year”
},
“计数”:{“$sum”:1},
“小时”:{“$sum”:“$hours”}
}}
],{“allowDiskUse”:true}
);
因此,您只需在这两个阶段中使用

此外,您还值得一看官方文档中提供的。其中有许多常见SQL操作的示例,以及如何以MongoDB方式实现它们


从您自己的数据中,但由我以以下方式插入:

db.transactions.insert([
{“雇员”:1,“日期”:新日期(“2014-01-01”),“假日类型”:1,“小时数”:8},
{“雇员”:1,“日期”:新日期(“2014-01-05”),“假日类型”:2,“小时数”:7},
{“雇员”:1,“日期”:新日期(“2014-02-15”),“假日类型”:1,“小时数”:8},
{“雇员”:1,“日期”:新日期(“2014-03-15”),“假日类型”:3,“小时数”:16},
{“雇员”:11,“日期”:新日期(“2014-01-01”),“假日类型”:1,“小时数”:8},
{“雇员”:11,“日期”:新日期(“2014-01-05”),“假日类型”:1,“小时数”:6},
{“雇员”:11,“日期”:新日期(“2014-02-15”),“假日类型”:1,“小时数”:8},
{“雇员”:11,“日期”:新日期(“2014-03-15”),“假日类型”:3,“小时数”:8}
])
这不是最好的例子,因为所有月份实际上都不同,但如果需要以这种方式分组,这将在“假日类型”上获得“不同”的值。结果如下:

{
“_id”:{
“雇员”:1,
“月”:2,
“年度”:2014年
},
“计数”:1,
“小时数”:8小时
}
{
“_id”:{
“雇员”:11,
“月”:2,
“年度”:2014年
},
“计数”:1,
“小时数”:8小时
}
{
“_id”:{
“雇员”:1,
“月”:1,
“年度”:2014年
},
“计数”:2,
“小时数”:15
}
{
“_id”:{
“雇员”:11,
“月”:1,
“年度”:2014年
},
“计数”:1,
“小时数”:14
}
{
“_id”:{
“雇员”:1,
“月”:3,
“年度”:2014年
},
“计数”:1,
“小时数”:16
}
{
“_id”:{
“雇员”:11,
“月”:3,
“年度”:2014年
},
“计数”:1,
“小时数”:8小时
}

hours到底是什么?从哪里来的?你能展示一些样本数据让我们有个想法吗?谢谢@Neil。我尝试了这个,我在hours列上得到了零。样本数据集是“employee”:“Karthick”
“holiday\u type”:1
“hourrs”:8,
“date”:2009-01-01“

”雇员“:“Karthick11”
“假日类型”:1
“时差”:8,
“日期”:2009-01-01“

“员工”:“假期类型”:1
“时差”:8,
“日期”:2009-01-01”

@Karthi您的
hourrs
字段拼写不同(且不正确),因此您不能仅“剪切粘贴”相反,你需要看看这些差异。而且,这真的应该是对你的问题的编辑,就像我已经做的那样(或从你以前的评论中尝试过的)。因此,请在将来编辑你的问题,而不是尝试发布其他细节(尤其是数据)在评论中。但我确实认为一般性的问题是值得证明这个概念的,所以你对此投了赞成票。谢谢你的建议。在我的实时数据中,它被称为“小时”仅限。我刚刚填充了样本数据并出错。还有什么会出错。@Karthi您的设置显然有问题。请参阅我在答案中提供的其他信息。所示的查询按预期工作。这是有效的。我的查询有错误。非常感谢Neil。我现在清楚地理解了这个逻辑。