我使用$ project运算符从Date中提取周部分,然后在聚合管道中按周进行分组。
{ $project: {
year: { $year: [ "$datetime" ] },
week: { $week: [ "$datetime" ] },
....
}
},
....
{ $group: {
_id: {
year: "$year",
week: "$week",
},
.....
}
}
但我使用的$ week运算符,总是将星期日视为一周的第一天,我们使用星期一作为我们所在地的第一天。因此,按周分组的结果对我来说总是不正确的。 有什么方法可以解决这个问题,或者已知的解决方法?
existing request in mongo tracking system似乎未解决超过一年(是否真的很少需要选项?) 欢迎任何可能的选择。也许有可能在javascript中创建一些自定义函数并在某处添加/替换它?
答案 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)
我认为你最好在应用程序领域处理它。
最好保持查询简单,并创建一个包装器方法,将结果格式化为您想要的表示。