GroupBy DayOfMonth in mongodb但是项目完成日期

时间:2014-07-29 05:42:40

标签: mongodb mongodb-query aggregation-framework

我有一个包含日期字段的Collection。我想通过dayOfMonth对它进行分组,但在投影时我想要投影完整的日期和关联计数。

我在mongodb中有一个包含时间戳(日期字段)的原始集合 这是我的聚合查询:

db.raw.aggregate(
{
    "$match" : { "Timestamp":{$gte:new Date("2012-05-30T00:00:00.000Z"),$lt:new Date("2014-05-31T00:00:00.000Z")}}
},
{ 
    $group: 
    { 
        _id: { ApplicationId: "$ApplicationId", date: {$dayOfMonth: '$Timestamp'}   }, 
        count: { $sum: 1 } 
    }
}
)

在上面的查询中,我正在使用dayOfMonth进行分组,但是如何使用count计划完成Date?

2 个答案:

答案 0 :(得分:1)

您的“时间戳”值显然是实际时间点,因此确实没有“完整日期”返回。您通常可以根据您应用的日期范围“进行数学运算”,并在处理返回的结果时返回“日期”值。

但是,您也可以通过将“timestamp”值四舍五入到当天来将“数学运算”应用于日期值。返回的值不再是日期对象,但是它们是自纪元值以来的毫秒,因此相对容易“播种”那些日期函数:

db.raw.aggregate([
    { "$match" : { 
        "Timestamp":{
            "$gte": new Date("2012-05-30"), 
            "$lt": new Date("2014-05-31")
        }
    }},
    { "$group": {
        "_id": {
            "$subtract": [
                { "$subtract": [ "$Timestamp", new Date("1970-01-01") ] },
                { "$mod": [
                    { "$subtract": [ "$Timestamp", new Date("1970-01-01") ] },
                    1000 * 60 * 60 * 24
                ])
            ]
        },
        "count": { "$sum": 1 }
    }}
])

因此,当您从另一个日期对象中减去一个日期对象时,差异是毫秒数作为数字返回。所以这只是通过减去纪元日期来规范化到纪元秒。其余的是将结果四舍五入到当天的基本日期数学。

或者,您可以再次使用其他日期聚合运算符并连接到字符串,但除非这些值是直接使用,否则通常会涉及更多工作:

db.raw.aggregate([
    { "$match" : { 
        "Timestamp":{
            "$gte": new Date("2012-05-30"), 
            "$lt": new Date("2014-05-31")
        }
    }},
    { "$group": {
        "_id": {
            "$concat": [
                 { "$substr": [{ "$year": "$Timestamp" },0,4] },
                 "-",
                 { "$substr": [{ "$month": "$Timestamp" },0,2] },
                 "-",
                 { "$substr": [{ "$dayOfMonth": "$Timestamp" },0,2] }
            ]
        },
        "count": { "$sum": 1 }
    }}
])

答案 1 :(得分:1)

Neil Lunn提供了一个很好的答案。 他们可以使用的另一种方法是:

db.raw.aggregate([
    {
        "$match" : 
            {   
                "Timestamp":{"$gte": new Date("2012-05-30"), "$lt": new Date("2014-07-31")}
            }
    },
    { 
        "$group" :
            {   
                "_id":{"$dayOfMonth": "$Timestamp"},
                "Date":{"$first":"$Timestamp"},
                "count": { "$sum": 1 }
            }
    }
])

它会返回你的日期。 希望这对你有帮助。