我有一个 shifts
集合,如下所示
{
"_id" : ObjectId("5885a1108c2fc432d649647d"),
"from" : ISODate("2017-01-24T06:21:00.000Z"), //can be weekday, sat, sun
"to" : ISODate("2017-01-24T08:21:00.000Z"),
"jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
"hourlyRate" : 32 //this wil vary based on **from** field
}
{
"_id" : ObjectId("5885a1108c2fc432d649647e"),
"from" : ISODate("2017-01-25T06:21:00.000Z"),
"to" : ISODate("2017-01-25T08:21:00.000Z"),
"jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
"hourlyRate" : 32
}
{
"_id" : ObjectId("5885a1108c2fc432d649647f"),
"from" : ISODate("2017-01-26T06:21:00.000Z"),
"to" : ISODate("2017-01-26T08:21:00.000Z"),
"jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
"hourlyRate" : 32
}
我希望能够生成这样的输出
作业A(这可以使用jobId获得)
-
平日收入 - 50美元(2 * 25美元)
-
周六收入 - $ 90(3 * $ 30)
-
周日收入 - 100美元(2 * 50美元)总收入= 240美元
工作B.
- 平日收入..............
总收入=工作A工作B ..... = $ X.
工作日或周六或周日可以从 from
字段派生 . 对于工作日,需要对周一至周五的所有日期进行分组 . 通过从 to
中减去 from
可以得出小时数 .
所以,我认为需要完成以下工作,但我无法在MongoDB中实现
-
分组
jobId
,从from
中提取的每日分组(也是所有工作日的分组),并通过减去from
和to
获得提取的小时数 . -
最后,获得上述所有金额的总和以获得总收入
-
获取所有工作收入的最终总和 .
我发现了一些类似的问题,但我无法将其应用于我的情况
mongodb group values by multiple fields
Mongodb Aggregation Framework | Group over multiple values?
How to group by multiple columns and multiple values in mongodb
使用案例:
当用户访问名为“收入”的页面时,我需要向他显示每个作业和总收入的上周收入(然后他可以更改日期范围) . 因此,我打算将节目分成每个工作,进一步分为工作日,周六和周日收入以及该工作的总收入和工作时间 . 最终总收入是所有个人工作收入的总和 .
P.S我正在使用MongoDB 3.4
2 回答
请遵循以下聚合查询:
第一个
$project
聚合通过进行多次算术计算,根据dayOfWeek
值为saturday
和sunday
提供 0 or 1 值 .第二个
$project
聚合根据saturday
和sunday
值计算weekday
的值 .第一个
$group
计算每个工作中每天的收入 .最后,第二个
$group
聚合计算所有工作的收入总和 .Test
这是我的意见:
上面的聚合查询给出以下输出:
在
jobs
数组中只有一个作业,因为shift集合的文档引用了相同的jobId
. 您可以尝试使用不同的jobId
,它会为您提供不同的工作总收入 .使用 $switch 运算符构建case语句的表达式来评估收益,您可以运行以下管道以获得所需的结果