【问题标题】:Aggregate data stored as time_t in MongoDB在 MongoDB 中聚合存储为 time_t 的数据
【发布时间】:2015-06-21 11:47:07
【问题描述】:

我有一个存储在 MongoDB 中的文档集合,其中包括一个 created 字段作为 unix 样式 time_t

例如

{"created": 1137459055216, "qty": 3 }

如何通过查询按月汇总这些数据?

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    您可以通过将计数添加到 new Date(0) 将 unix epoch ms 计数转换为原生 Date 对象以进行聚合。例如:

    db.test.aggregate([
        {$group: {
            _id: {$month: {$add: [new Date(0), '$created']}},
            qty: {$sum: '$qty'}
        }}
    ])
    

    或者,如果您想按月和年汇总,添加一个进行转换的$project,然后您可以轻松地在您的$group 中多次引用它:

    db.test.aggregate([
        {$project: {
            createdDate: {$add: [new Date(0), '$created']},
            qty: '$qty'
        }},
        {$group: {
            _id: {
                year: {$year: '$createdDate'}, 
                month: {$month: '$createdDate'}
            },
            qty: {$sum: '$qty'}
        }}
    ])
    

    请注意,如果 created 计数而不是 ms 计数,您还需要将其乘以 1000:

    createdDate: {$add: [new Date(0), { $multiply: ['$created', 1000] }]}
    

    【讨论】:

    • 工作得很好——为了完整起见,因为存储的时间以秒为单位,您需要在添加之前乘以 1000: createdDate: {$add: [new Date(0), { $multiply: [ '$已创建', 1000] }]},
    • 太棒了。您的示例文档中的created 时间只有在它是 ms 时才有意义,所以这就是我的假设。我会将其添加到答案中,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2016-01-01
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多