преобразование миллисекунд на дату в конвейере агрегации 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"
    }
  }}
])

Вы можете попробовать здесь