MongoDB - $ week函数和聚合中的第一天

时间:2014-02-03 09:22:57

标签: mongodb

我使用$ project运算符从Date中提取周部分,然后在聚合管道中按周进行分组。

{ $project: { 
    year: { $year: [ "$datetime" ] }, 
    week: { $week: [ "$datetime" ] }, 
    ....
    }
},
....
{ $group: { 
    _id: { 
        year: "$year", 
        week: "$week", 
        },
        .....
    }
}

但我使用的$ week运算符,总是将星期日视为一周的第一天,我们使用星期一作为我们所在地的第一天。因此,按周分组的结果对我来说总是不正确的。 有什么方法可以解决这个问题,或者已知的解决方法?

existing request in mongo tracking system似乎未解决超过一年(是否真的很少需要选项?) 欢迎任何可能的选择。也许有可能在javascript中创建一些自定义函数并在某处添加/替换它?

5 个答案:

答案 0 :(得分:7)

您可以使用以下管道根据您的要求修改$ week操作

[{ 
  $project: 
  {
    week: { $week: [ "$datetime" ] },
    dayOfWeek:{$dayOfWeek:["$datetime"]}
  }
},
{
  $project:
    {
      week:{$cond:[{$eq:["$dayOfWeek",1]},{$subtract:["$week",1]},'$week']}
    }
}]

它的作用是在第一阶段它预测weekOfYear和dayOfWeek。在第二阶段,它检查dayOfWeek是否是星期日,如果是这样,那么它会修改一周到一周-1。然后这将像周一开始一样运作。

答案 1 :(得分:6)

MongoDB最终在3.4中添加了$isoWeek$isoWeekYear,这将在星期一开始。

更多信息:https://docs.mongodb.com/manual/reference/operator/aggregation/isoWeek/

答案 2 :(得分:2)

特技:只需从日期时间减去一天即可更改一行

$project: { 
    year: { $year: [ "$datetime" ] }, 
    week: { $week: {$subtract: ["$datetime", 86400000] } }, // <--- minus 1 day (in ms).
    ....
    }

这适用于新旧mongo版本。

答案 3 :(得分:1)

评论Oleg的解决方案:

有一个陷阱。当年份从星期日开始时,将其移回前一天将使您进入上一年的周数(53),但该年份仍会显示当年。我想。

此外,如果您使用的是$ isoWeek,则可以使用类似的技巧,方法是添加一天(如果希望一周从星期日开始则添加一天,否则不添加任何内容)

答案 4 :(得分:0)

我认为你最好在应用程序领域处理它。

最好保持查询简单,并创建一个包装器方法,将结果格式化为您想要的表示。