如何在mongodb中按周分组文档

时间:2018-03-27 07:29:58

标签: node.js mongodb mongoose mongodb-query aggregation-framework

如何计算每个用户按星期计算的总小时数以及从星期五到星期四的周开始

记录

{
  "_id" : ObjectId("5a69cd076b2beec65fa900e9"),
  "clock_date" : ISODate("2018-01-13T00:00:00.000Z"),
  "clock_in_time" : "10:40:53",
  "clock_out_time" : "12:40:53", 
},
{
  "_id" : ObjectId("5a69cd076b2beec65fa900e9"),
  "clock_date" : ISODate("2018-01-12T00:00:00.000Z"),
  "clock_in_time" : "10:00:53",
  "clock_out_time" : "10:40:53", 
},
{
  "_id" : ObjectId("5a69cd076b2beec65fa900e9"),
  "clock_date" : ISODate("2018-01-20T00:00:00.000Z"),
  "clock_in_time" : "10:20:00",
  "clock_out_time" : "12:40:53", 
},
{
  "_id" : ObjectId("5a69cd076b2beec65fa900e9"),
  "clock_date" : ISODate("2018-01-21T00:00:00.000Z"),
  "clock_in_time" : "10:40:53",
  "clock_out_time" : "11:40:53", 
},

结果

 {
  week:'Jan 05, 2018 to Jan 11, 2018'
  totalhourse : 4
 },
 {
  week:'Jan 12, 2018 to Jan 18, 2018'
  totalhourse : 2:23
 },

。 。 。 。

1 个答案:

答案 0 :(得分:0)

总结这个模式的总小时数将是艰难的,我们应该进行大量的计算,因为你已经捕获了时间和超时字符串。为了找到差异,我们需要将hours:minutes:seconds分开,然后我们必须找到差异。

"clock_in_time" : "10:40:53",
"clock_out_time" : "12:40:53",

或者,您可以修改架构以将时间和时间捕获为带时间戳的日期。

"clock_in_time" : ISODate("2018-01-13T10:40:53.123+05:30"),
"clock_out_time" : ISODate("2018-01-13T12:40:53.121+05:30"),

如果完成此修改,则可以使用聚合管道来获得所需的结果

首先在聚合管道中

  • 使用$match和$并过滤日期内的文档 范围(这里您可以在周开始日期和周结束日期提供)

  • 然后将$subtract$project

  • 一起使用

请注意,此查询一次只能给您一周的结果

参考文献:

Subtracting time

$match with $and operator