преобразование миллисекунд на дату в конвейере агрегации mongodb для group by?
Мне нужно преобразовать миллисекунды в формат даты в MongoDB агрегации pipiline -
мой запрос -
db.campaign_wallet.aggregate({"$match" : {"campaignId" : 1, "txnTime" : { "$gte" : 1429554600000, "$lte" : 1430159400000}}}, {"$group" : {"_id" : {"msisdn" : "$msisdn", "txnTime" : "$txnTime"}, "count" : {"$sum": 1}}});
в этом запросе как преобразовать txnTime (который находится в миллисекундах) в дату в конвейере ?
2 ответов
Я пытаюсь получить логику преобразования txnTime
поле для объекта даты, потому что группировка по полю даты или метке времени в миллисекундах (например, то, что вы сейчас делаете) даст тот же результат, что и они оба уникальны в своих соответствующих форматах!
изменить txnTime
поле для объекта даты вы должны включить $project
до $group
этап конвейера с этим выражением
"txnTime": {
"$add": [ new Date(0), "$txnTime" ]
}
так что вы можете сделать свой $group
операция на преобразованном / проецируемом поле txnTime:
db.campaign_wallet.aggregate([
{
"$match": {
"campaignId" : 1 ,
"txnTime" : {
"$gte" : 1429554600000 ,
"$lte" : 1430159400000
}
}
},
{
"$project": {
"txnTime": {
"$add": [ new Date(0), "$txnTime" ]
},
"msisdn": 1
}
},
{
"$group" : {
"_id" : {
"txnTime" : "$txnTime",
"msisdn":"$msisdn"
},
"msisdnCount" : { "$sum" : 1}
}
}
]);
выход: (на основе образцов документов из этого вопрос)
/* 0 */
{
"result" : [
{
"_id" : {
"txnTime" : ISODate("2015-04-25T18:30:00.000Z"),
"msisdn" : "91808770101"
},
"msisdnCount" : 1
},
{
"_id" : {
"txnTime" : ISODate("2015-04-27T05:11:54.796Z"),
"msisdn" : "9180877010"
},
"msisdnCount" : 1
},
{
"_id" : {
"txnTime" : ISODate("2015-04-25T18:30:01.111Z"),
"msisdn" : "91808070101"
},
"msisdnCount" : 1
},
{
"_id" : {
"txnTime" : ISODate("2015-04-25T18:30:00.000Z"),
"msisdn" : "91808070101"
},
"msisdnCount" : 2
},
{
"_id" : {
"txnTime" : ISODate("2015-04-27T05:11:54.796Z"),
"msisdn" : "9189877000"
},
"msisdnCount" : 1
},
{
"_id" : {
"txnTime" : ISODate("2015-04-27T05:11:54.796Z"),
"msisdn" : "9189877667"
},
"msisdnCount" : 1
}
],
"ok" : 1
}
-- обновление --
сгруппировать документы по дате в формате YYYY-MM-DD
используйте Дата Агрегации Операторы
пример:
db.campaign_wallet.aggregate([
{
"$match": {
"campaignId" : 1 ,
"txnTime" : {
"$gte" : 1429554600000 ,
"$lte" : 1430159400000
}
}
},
{
"$project": {
"txnTime": {
"$add": [ new Date(0), "$txnTime" ]
},
"msisdn": 1
}
},
{
"$project":
{
"year": { "$year": "$txnTime" },
"month": { "$month": "$txnTime" },
"day": { "$dayOfMonth": "$txnTime" },
"msisdn": 1,
"txnTime": 1
}
},
{
"$group" : {
"_id" : {
"txnTime_year" : "$year",
"txnTime_month" : "$month",
"txnTime_day" : "$day",
"msisdn": "$msisdn"
},
"msisdnCount" : { "$sum" : 1}
}
}
]);
выход:
/* 0 */
{
"result" : [
{
"_id" : {
"txnTime_year" : 2015,
"txnTime_month" : 4,
"txnTime_day" : 25,
"msisdn" : "91808770101"
},
"msisdnCount" : 1
},
{
"_id" : {
"txnTime_year" : 2015,
"txnTime_month" : 4,
"txnTime_day" : 25,
"msisdn" : "91808070101"
},
"msisdnCount" : 3
},
{
"_id" : {
"txnTime_year" : 2015,
"txnTime_month" : 4,
"txnTime_day" : 27,
"msisdn" : "9180877010"
},
"msisdnCount" : 1
},
{
"_id" : {
"txnTime_year" : 2015,
"txnTime_month" : 4,
"txnTime_day" : 27,
"msisdn" : "9189877000"
},
"msisdnCount" : 1
},
{
"_id" : {
"txnTime_year" : 2015,
"txnTime_month" : 4,
"txnTime_day" : 27,
"msisdn" : "9189877667"
},
"msisdnCount" : 1
}
],
"ok" : 1
}
С mongodb 4.0 вы можете попробовать $toDate
агрегация для преобразования миллисекунд в формат даты
db.collection.aggregate([
{ "$match": {
"campaignId" : 1 ,
"txnTime" : {
"$gte" : 1429554600000 ,
"$lte" : 1430159400000
}
}},
{ "$project": {
"toDate": {
"$toDate": "$txnTime"
}
}}
])
Вы можете попробовать здесь