首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb中的GroupBy DayOfMonth但项目完成日期

mongodb中的GroupBy DayOfMonth但项目完成日期
EN

Stack Overflow用户
提问于 2014-07-29 05:42:39
回答 2查看 667关注 0票数 2

我有一个包含日期字段的集合。我想按dayOfMonth对其进行分组,但在投影时,我希望预测完整的日期和相关的计数。

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

代码语言:javascript
复制
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进行分组,但是如何用计数来完成日期呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-29 06:13:16

您的“时间戳”值显然是时间上的实际点,因此确实没有返回的“完整日期”。您可以根据您正在应用的日期范围和在处理返回的结果时返回的“月中日”值来“计算”。

但是,也可以通过将“时间戳”值舍入到当天,从而对日期值“应用数学”。返回的值不再是日期对象,但它们是自历元值以来的毫秒,因此“种子”这些日期函数是相对容易的:

代码语言:javascript
复制
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 }
    }}
])

因此,当您从另一个日期对象中减去一个日期对象时,差别是毫秒,它将作为一个数字返回。因此,这只是通过减去划时代日期来规范为划时代的秒。其余的是基本的日期数学,将结果相加到当前。

另外,您也可以使用其他日期聚合操作符并连接到字符串,但通常需要做更多的工作,除非这些值是直接使用的:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-07-29 06:54:03

尼尔·伦恩给出了一个很好的答案。他们的另一种你可以使用的方法:

代码语言:javascript
复制
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 }
            }
    }
])

它会把你的约会还给你。希望这对你有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25008889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档