mongodb - 如何将数字 1 格式化为字符串 "01"以进行聚合?

标签 mongodb mongodb-query aggregation-framework

我正在尝试根据文档中的日期字段以“YYYYMMDD”的形式创建聚合键。但是,使用 $month$dayOfMonth 运算符,我只能返回数字,而无法将它们格式化为前导零(此外,我无法连接数字)。

由于 Map/Reduce 的阻塞性质,我更喜欢聚合而不是 Map/Reduce。有什么想法吗?

最佳答案

您基本上使用 $concat运算符以几个条件连接字符串,以及 $substr处理转换:

"day": { 
    "$concat": [
        { "$substr": [ { "$year": "$date" }, 0, 4  ] },
        { "$cond": [
            { "$lte": [ { "$month": "$date" }, 9 ] },
            { "$concat": [
                "0", { "$substr": [ { "$month": "$date" }, 0, 2 ] }
            ]},
            { "$substr": [ { "$month": "$date" }, 0, 2 ] }
        ]},
        { "$cond": [
            { "$lte": [ { "$dayOfMonth": "$date" }, 9 ] },
            { "$concat": [
                "0", { "$substr": [ { "$dayOfMonth": "$date" }, 0, 2 ] }
            ]},
            { "$substr": [ { "$dayOfMonth": "$date" }, 0, 2 ] }
        ]}
    ]
}

如果您按“天”聚合,另一种方法是仅使用带有日期数学的“纪元”值:

"day": {
    "$subtract": [
        { "$subtract": [ "$date", new Date("1970-01-01") ] },
        { "$mod": [
            { "$subtract": [ "$date", new Date("1970-01-01") ] },
            1000 * 60 * 60 * 24
        ]}
    ]
}

对两个日期对象的任何日期数学运算都会导致纪元毫秒作为差异。因此,使用纪元日期作为日期对象以进行转换。结果值是时间戳值的“天”,可以在处理结果时反馈以创建日期对象。

可以说,您可以使用 $year 在后期处理中做同样的事情和 $dayOfYear结果,因为这些也足以在客户端处理中重构日期对象

关于mongodb - 如何将数字 1 格式化为字符串 "01"以进行聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25114870/

相关文章:

arrays - 有条件地减少 Mongo 聚合中的两个数组字段

java - 如何计算mongo中引用集合的不同值

java - MongoDB Spring 数据 Criteria.all

javascript - 扩展模式 Mongoose 中的继承方法 "virtual"不起作用

MongoDB:获取 GridFS 中可用的存储桶列表?

ruby-on-rails-3 - mongoid 查询 - 调用 size 方法会产生错误

python - 检查用户名是否已存在于数据库中(Python + Pymongo)

java - 为什么 CustomProjectAggregationOperation 在 SpringMongoTemplate 中不起作用

mongodb - 如何计算mongodb spring中特定字段的平均值?

python - 如何从 python 中使用 mongolab 附加组件到 Heroku?