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

标签 mongodb mongodb-query aggregation-framework

我有一个包含日期字段的集合。我想按 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 进行分组,但是如何用计数来预测完成日期?

最佳答案

您的“时间戳”值显然是实际时间点,因此实际上没有“完整日期”可返回。您通常可以根据您所应用的日期范围以及处理返回结果时返回的“月份中的某一天”值来“进行数学计算”。

但是,您也可以通过将“时间戳”值四舍五入到日期,按顺序“应用数学”到日期值。返回的值不再是日期对象,而是自纪元以来的毫秒值,因此将这些值“播种”到日期函数相对容易:

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 }
    }}
])

关于mongodb - mongodb 中的 GroupBy DayOfMonth 但项目完成日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25008889/

相关文章:

javascript - 用对象列表替换字符串列表 - mongoDB

node.js - 环回远程方法中的自定义 CRUD 用于收集而不是 mongodb 模型

mongodb - Mongodb 使用 $in 在另一个查询中使用查询结果

mongodb - 当排序字段不是shard key的一部分时,mongos会对所有mongod返回的数据进行排序吗?

MongoDB "count"使用 "$in"变得太慢

MongoDb.展平内部数组

mongodb - mongodb 聚合是否应该与性能关键的 Http 请求一起使用

mongodb - 需要按小时汇总且无法识别 $avg

mongodb - 如何使用 MongoDB 或其他文档数据库保存视频文件,可选择添加到现有二进制文件和并行读/写

如果选择标记分片键,MongoDB 仅将数据存储到主分片