Я пытаюсь агрегировать записи в коллекции MongoDB по часам, и мне нужно преобразовать дату, сохраненную в виде метки времени (миллисекунды), в ISODate, чтобы я мог использовать встроенные операторы даты агрегированной структуры ($ hour, $ month и т.д.)
Записи хранятся как
{
"data" : { "UserId" : "abc", "ProjId" : "xyz"},
"time" : NumberLong("1395140780706"),
"_id" : ObjectId("532828ac338ed9c33aa8eca7")
}
Я пытаюсь использовать агрегированный запрос следующего типа:
db.events.aggregate(
{
$match : {
"time" : { $gte : 1395186209804, $lte : 1395192902825 }
}
},
{
$project : {
_id : "$_id",
dt : {$concat : (Date("$time")).toString()} // need to project as ISODate
}
},
// process records further in $project or $group clause
)
который дает результаты в виде:
{
"result" : [
{
"_id" : ObjectId("5328da21fd207d9c3567d3ec"),
"dt" : "Fri Mar 21 2014 17:35:46 GMT-0400 (EDT)"
},
{
"_id" : ObjectId("5328da21fd207d9c3567d3ed"),
"dt" : "Fri Mar 21 2014 17:35:46 GMT-0400 (EDT)"
},
...
}
Я хочу извлечь час, день, месяц и год из даты, но так как время проецируется в виде строки, я не могу использовать встроенные операторы даты в агрегированной структуре ($ час и т.д.).
Как я могу преобразовать время из миллисекунд в дату ISO, чтобы сделать что-то вроде следующего:
db.events.aggregate(
{
$match : {
"time" : { $gte : 1395186209804, $lte : 1395192902825 }
}
},
{
$project : {
_id : "$_id",
dt : <ISO date from "$time">
}
},
{
$project : {
_id : "$_id",
date : {
hour : {$hour : "$dt"}
}
}
}
)