SQL*_*ion 23 mongodb mongo-java
我有一个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);
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用命令行(未测试,我只测试了java版本):
{
$group: {
_id: {
"year": {
"$year", "$tDate"
},
"month": {
"$month", "$tDate"
},
"day": {
"$dayOfMonth", "$tDate"
},
"customer": "$customer"
},
"eventCount": {
"$sum": "$eventCount"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何在聚合框架内将这些日期转换为CET?
例如'2013-09-16 23:45:00 UTC'是'2013-09-17 00:45:00 CET',这是另一天.
3rf*_*3rf 15
我不是CET及其与UTC的关系的专家,但是下面的代码(对于shell)应该对MongoDB日期类型进行适当的转换(添加一小时):
db.dates.aggregate(
{$project: {"tDate":{$add: ["$tDate", 60*60*1000]}, "eventCount":1, "customer":1}}
)
Run Code Online (Sandbox Code Playgroud)
如果在管道的其余部分之前运行该项目命令,则结果应该在CET中.
小智 7
搜索了几个小时后,这个解决方案对我有用.它也很简单.只需通过减去时区偏移量(以毫秒为单位)来转换时区.
25200000 = 7小时偏移// 420分钟*60秒*1000米
$group: {
_id = {
year: { $year : [{ $subtract: [ "$timestamp", 25200000 ]}] },
month: { $month : [{ $subtract: [ "$timestamp", 25200000 ]}] },
day: { $dayOfMonth : [{ $subtract: [ "$timestamp", 25200000 ]}] }
},
count = {
$sum : 1
}
};
Run Code Online (Sandbox Code Playgroud)
您可以提供timezone
从3.6开始的日期运算符.
用您的时区替换时区.
{
"$group":{
"_id":{
"year":{"$year":{"date":"$tDate","timezone":"America/Chicago"}},
"month":{"$month":{"date":"$tDate","timezone":"America/Chicago"}},
"dayOfMonth":{"$dayOfMonth":{"date":"$tDate","timezone":"America/Chicago"}}
},
"count":{"$sum":1}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10001 次 |
最近记录: |