我有一个事务表,它由员工休假填充。我需要帮助以下sql场景在mongodb。
select employee,month,year,count(distinct (holiday_type),sum(hours) from按员工、月、年分组的事务
我已经开始mongodb几个星期前。我已经得到了部分答案通过堆栈溢出后Mongodb计数与多个组字段不同,现在我希望添加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
因此,"hours"实际上是文档中的一个字段(属性)。因此,根据前面的答案,您只需将双分组抽象如下:
db.transactions.aggregate([
{ "$group": {
"_id": {
"employee" : "$employee",
"Month": { "$month" : "$date" },
"Year": { "$year" : "$date" },
"holiday_type" : "$holiday_type"
},
"hours": { "$sum": "$hours" }
}},
{ "$group": {
"_id": {
"employee" : "$_id.employee",
"Month": "$_id.Month",
"Year": "$_id.Year"
},
"count": { "$sum": 1 },
"hours": { "$sum": "$hours" }
}}
], { "allowDiskUse": true }
);
所以你只是在两个阶段使用 $sum
。
此外,应该值得您查看官方文档中提供的SQL到Aggregation映射图。它有许多常见的SQL操作的例子,以及如何在MongoDB中实现它们。
从你自己的数据中,但我自己以这种方式插入:
db.transactions.insert([
{ "employee": 1, "date": new Date("2014-01-01"), "holiday_type": 1, "hours": 8 },
{ "employee": 1, "date": new Date("2014-01-05"), "holiday_type": 2, "hours": 7 },
{ "employee": 1, "date": new Date("2014-02-15"), "holiday_type": 1, "hours": 8 },
{ "employee": 1, "date": new Date("2014-03-15"), "holiday_type": 3, "hours": 16 },
{ "employee": 11, "date": new Date("2014-01-01"), "holiday_type": 1, "hours": 8 },
{ "employee": 11, "date": new Date("2014-01-05"), "holiday_type": 1, "hours": 6 },
{ "employee": 11, "date": new Date("2014-02-15"), "holiday_type": 1, "hours": 8 },
{ "employee": 11, "date": new Date("2014-03-15"), "holiday_type": 3, "hours": 8 }
])
这不是最好的例子,因为所有的月份实际上是不同的,但如果需要这样分组,这将在"holiday_type"上获得"不同"的值。结果是:
{
"_id" : {
"employee" : 1,
"Month" : 2,
"Year" : 2014
},
"count" : 1,
"hours" : 8
}
{
"_id" : {
"employee" : 11,
"Month" : 2,
"Year" : 2014
},
"count" : 1,
"hours" : 8
}
{
"_id" : {
"employee" : 1,
"Month" : 1,
"Year" : 2014
},
"count" : 2,
"hours" : 15
}
{
"_id" : {
"employee" : 11,
"Month" : 1,
"Year" : 2014
},
"count" : 1,
"hours" : 14
}
{
"_id" : {
"employee" : 1,
"Month" : 3,
"Year" : 2014
},
"count" : 1,
"hours" : 16
}
{
"_id" : {
"employee" : 11,
"Month" : 3,
"Year" : 2014
},
"count" : 1,
"hours" : 8
}