这是我的查询,我想将$_id组合到YYYY-MM-DD?或任何函数像Mysql DATE()转换DATETIME格式到日期格式?
db.event.aggregate([
{
$project: {
"created": {$add: ["$created", 60*60*1000*8]},
}
},
{
$group: {
"_id": {
"year": {"$year": "$created"},
"month": {"$month": "$created"},
"day": {"$dayOfMonth": "$created"}
},
"count": { $sum: 1 }
}
}
])
通过使用日期聚合操作符将组件拆分为复合_id
键,您基本上已经做到了这一点,这可能是处理它的最佳方法。实际上,您可以通过 $substr
操作符和 $concat
:
db.event.aggregate([
{ "$project": {
"created": {$add: ["$created", 60*60*1000*8]},
}},
{ "$group": {
"_id": {
"year": {"$year": "$created"},
"month": {"$month": "$created"},
"day": {"$dayOfMonth": "$created"}
},
"count": { "$sum": 1 }
}},
{ "$project": {
"_id": { "$concat": [
{ "$substr": [ "$_id.year", 0, 4 ] },
"-",
{ "$cond": [
{ "$lte": [ "$_id.month", 9 ] },
{ "$concat": [
"0",
{ "$substr": [ "$_id.month", 0, 2 ] }
]},
{ "$substr": [ "$_id.month", 0, 2 ] }
]},
"-",
{ "$cond": [
{ "$lte": [ "$_id.day", 9 ] },
{ "$concat": [
"0",
{ "$substr": [ "$_id.day", 0, 2 ] }
]},
{ "$substr": [ "$_id.day", 0, 2 ] }
]}
]},
"count": 1
}}
])
所以有一点从日期部分到字符串的值的强制转换,以及像在"YYYY-MM-DD"格式中填充任何两个数字以下的值,前导0。
注意到它可以做到,并且已经能够做到一段时间了,但是在 $substr
操作符的手册页描述中明显缺少。
不确定你开始的"日期数学"。我想说,您最好使用聚合操作符,然后处理您想要调整的值,或者如果确实是像"时区"校正一样的东西,那么您可能会更好地处理客户端。