是否可以在MongoDB上的聚合管道中键入转换数据?

Raf*_*ini 7 mongodb aggregation-framework

当我需要使用aggregateMongoDB上的命令按日期聚合事物时,我通常这样做:

 db.mycollection.aggregate(
 {
        $project: {
            day: {$dayOfMonth: "$date"},
            mon: {$month: "$date"},
            year: {$year: "$date"},
        }
    },
    {
        $group: {
            _id : {day: "$day", mon: "$mon", year: "$year"},
            count: {$sum: 1}
        }
    }
 )
Run Code Online (Sandbox Code Playgroud)

并最终将day,monyear字段连接到应用程序中的日期字符串.但是出于很多原因,有时我想在离开数据库之前连接字段,所以我最初尝试过:

 db.mycollection.aggregate(
 {
        $project: {
            day: {$dayOfMonth: "$date"},
            mon: {$month: "$date"},
            year: {$year: "$date"},
        }
    },
    $project: {
            datestr: {
                $concat : ["$year", "-", "$month", "-", "$day"]
            }
        }
    },

    {
        $group: {
            _id : {day: "$day", mon: "$mon", year: "$year"},
            count: {$sum: 1}
        }
    }
 )
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为$concat期望字符串和day,mon并且year是整数.所以,我的问题是:我可以用$project操作键入一个字段吗?

hei*_*nob 6

是的,您可以使用$substr将数字转换为字符串.您丢失的链接如下所示:

{
    $project: {
        day_s:  { $substr: [ "$day",   0, 2 ] }, 
        mon_s:  { $substr: [ "$month", 0, 2 ] }, 
        year_s: { $substr: [ "$year",  0, 4 ] }
    }
}
Run Code Online (Sandbox Code Playgroud)