我有一个MongoDB,它将日期对象存储在UTC中.我想在不同的时区(CET)按年、月、日进行聚合.

这样做对UTC来说很好:

    BasicDBObject group_id = new BasicDBObject("_id", new BasicDBObject("year", new BasicDBObject("$year", "$tDate")).
                append("month", new BasicDBObject("$month", "$tDate")).
                append("day", new BasicDBObject("$dayOfMonth", "$tDate")).
                append("customer", "$customer"));

    BasicDBObject groupFields = group_id.
            append("eventCnt", new BasicDBObject("$sum", "$eventCnt")); 

    BasicDBObject group = new BasicDBObject("$group", groupFields);

或者,如果使用命令行(未测试,我只测试了java版本):

{
    $group: {
        _id: {
            "year": {
                "$year", "$tDate"
            },
            "month": {
                "$month", "$tDate"
            },
            "day": {
                "$dayOfMonth", "$tDate"
            },
            "customer": "$customer"
        },
        "eventCount": {
            "$sum": "$eventCount"
        }
    }
}

如何在聚合框架内将这些日期转换为CET?

例如,"2013-09-16 23:45:00 UTC"是"2013-09-17 00:45:00 CET",这是不同的一天.

推荐答案

我不是CET及其与UTC关系方面的专家,但以下代码(用于shell)应该对MongoDB日期类型进行适当转换(增加一个小时):

db.dates.aggregate(
  {$project: {"tDate":{$add: ["$tDate", 60*60*1000]}, "eventCount":1, "customer":1}}
)

如果在管道的其余部分之前运行该项目命令,则结果应该是CET.

Mongodb相关问答推荐

MongoDB-如何过滤和获取数组字段中的最新数据

筛选出嵌套数组中的记录Mongo DB聚合

在mongdob中按子文档筛选不起作用

Select 筛选聚合中的嵌套字段

Mongo 将一个数组链接到另一个数组

使用 multer 在我的 MERN 前端显示 MongoDB 图像的正确语法是什么?

MongoDB 按日期时间字段查询 1h 间隔

Spring Boot 升级后未映射 Mongo 模板结果

MongoDB shell:如何删除列表以外的所有集合

lexik_jwt_authentication下无法识别的选项api_platform

在 mongodb 聚合中的阶段之后输出具有序列数字 id 的新集合

使用 AngularJs 和 MongoDB/Mongoose

Mongoose 架构引用和未定义类型ObjectID

具有最佳插入/秒性能的数据库?

mongodb上不区分大小写的查询

Express 无法 PUT/DELETE 方法.出了什么问题?

为什么不建议在 MongoDB 中使用服务器端存储函数?

Node + Mongoose:获取最后插入的 ID?

如何在 Rails 中混合使用 mongodb 和传统数据库?

Spring Data MongoDB - 在哪里以编程方式为 Mongo 集合创建索引?