5

我坚持实现weekofMonth而不是WeekofYear. 有人可以指导我如何做到这一点吗?

db.activity.aggregate([
    {
        $group:{
            _id: {
                week: { $week: "$createdAt" }, 
                month: { $month: "$createdAt" },      
                year: { $year: "$createdAt" } 
            },
            count: { $sum: 1 }
        }
     },
     { $match : { "_id.year" : 2016, "_id.month" : 5 } }
])

输出

/* 1 */
{
    "_id" : {
        "week" : 19,
        "month" : 5,
        "year" : 2016
    },
    "count" : 133.0
}

/* 2 */
{
    "_id" : {
        "week" : 18,
        "month" : 5,
        "year" : 2016
    },
    "count" : 1.0
}

在上面显示的数据中,它实际上没有显示weekofMonth。鉴于第 18 周是本月的第一周,我怎样才能得到这个?

4

1 回答 1

5

$week运算符为您提供一年中的一周,如文档中所述

可以通过获取月份中的日期并除以 7 来计算月份中的星期几。

db.activity.aggregate([
    {$project: {
        "year": {$year: "$createdAt"},
        "month": {$month: "$createdAt"},
        "weekOfMonth": {$floor: {$divide: [{$dayOfMonth: "$createdAt"}, 7]}}
    }},
    {$group: {
        "_id": {"year": "$year", "month": "$month", "weekOfMonth": "$weekOfMonth"},
        count: { $sum: 1 }
    }},
    {$match : { "_id.year" : 2016, "_id.month" : 5}}
])

请注意,这里的月份星期是从 0 开始的。如果您希望它从 1 开始,只需$add 1。此外,$floor运算符是 3.2 版中的新功能。

编辑

您可以使用$mod模拟地板(存在于版本 3.0 中)

"weekOfMonth": {$subtract: [{$divide: [{$dayOfMonth: "$createdAt"}, 7]}, {$mod: [{$divide: [{$dayOfMonth: "$createdAt"}, 7]}, 1]}]},
于 2016-05-11T13:42:05.033 回答