日期表达式运算符主要用于实现日期运算,主要包括了转换成日期、获取日期的年月日时分秒等操作
一、准备数据
初始化日期数据
db.persons.insertMany([
{ "_id": "1", "name": "张三", "birth": "1998-10-20 12:00:00.235" },
{ "_id": "2", "name": "李四", "birth": "1993-08-16 20:08:20.890" }
])
二、字符串转日期($toDate)
语法:{ $toDate: <expression> }
将表达式的结果转换成日期
4.0及以后版本可用
例子:转换人员的出生日期
db.persons.aggregate([
{
$project: {
"name": 1,
"birth": { $toDate: "$birth" }
}
}
])
聚合查询的结果如下:
{ "_id" : "1", "name" : "张三", "birth" : ISODate("1998-10-20T12:00:00.235Z") }
{ "_id" : "2", "name" : "李四", "birth" : ISODate("1993-08-16T20:08:20.890Z") }
三、字符串转日期($dateFromString)
语法:
{
$dateFromString: {
dateString: <dateStringExpression>,
format: <formatStringExpression>,
timezone: <tzExpression>,
onError: <onErrorExpression>,
onNull: <onNullExpression>
}
}
其中,
dateString: <dateStringExpression>:代表的是需要转换成日期的字符串表达式
format: <formatStringExpression>:可选,代表的是转换格式表达式
默认使用:"%Y-%m-%dT%H:%M:%S.%LZ"
timezone: <tzExpression>:可选,代表的是转换成日期时使用的时区的表达式
onError: <onErrorExpression>:可选,代表的是转换失败时的处理方式的表达式
onNull: <onNullExpression>:可选,代表的是Null的情况下的处理方式的表达式
例子:转换人员的出生日期
db.persons.aggregate([
{
$project: {
"name": 1,
"birth": {
$dateFromString: {
dateString: "$birth"
}
}
}
}
])
聚合查询的结果如下:
{ "_id" : "1", "name" : "张三", "birth" : ISODate("1998-10-20T12:00:00.235Z") }
{ "_id" : "2", "name" : "李四", "birth" : ISODate("1993-08-16T20:08:20.890Z") }
例子:转换人员的出生日期
db.persons.aggregate([
{
$project: {
"name": 1,
"birth": {
$dateFromString: {
dateString: "$birth",
format: "%Y-%m-%d %H:%M:%S.%L"
}
}
}
}
])
聚合查询的结果如下:
{ "_id" : "1", "name" : "张三", "birth" : ISODate("1998-10-20T12:00:00.235Z") }
{ "_id" : "2", "name" : "李四", "birth" : ISODate("1993-08-16T20:08:20.890Z") }
具体的格式说明如下:
定义 | 描述 | 值范围 |
---|---|---|
| 第几天,2位,不够2位用0补充,指的是某月中的第几天 |
|
| 小时,2位,不够2位用0补充,24小时制 |
|
| 毫秒,3位,不够3位用0补充 |
|
| 月,2位,不够2位用0补充 |
|
| 分钟,2位,不够2位用0补充 |
|
| 秒,2位,不够2位用0补充 |
|
| 年,4位,不够4位用0补充 |
|
四、日期转字符串($dateToString)
语法:
{
$dateToString: {
date: <dateExpression>,
format: <formatString>,
timezone: <tzExpression>,
onNull: <expression>
}
}
其中,
date: <dateExpression>:代表的是需要转换成字符串的日期表达式
format: <formatString>:可选,代表的是转换格式字符串
默认使用:"%Y-%m-%dT%H:%M:%S.%LZ"
timezone: <tzExpression>:可选,代表的是转换成日期时使用的时区的表达式
onNull: <expression>:可选,代表的是Null的情况下的处理方式的表达式
例子:转换人员的出生日期(只保留年月日)
db.persons.aggregate([
{
$project: {
"name": 1,
"birth": {
$dateToString: {
date: {
$dateFromString: {
dateString: "$birth",
format: "%Y-%m-%d %H:%M:%S.%L"
}
},
format: "%Y/%m/%d"
}
}
}
}
])
我们对上面的聚合查询进行解释:
(1)使用dateFormString将birth转换成日期类型
(2)使用dateToString将日期类型再转换成字符串类型,转换过程中使用format完成格式化
聚合查询的结果如下:
{ "_id" : "1", "name" : "张三", "birth" : "1998/10/20" }
{ "_id" : "2", "name" : "李四", "birth" : "1993/08/16" }
五、获取年、月、时、分、秒、毫秒
语法:
获取年:{ $year: <dateExpression> }
获取月:{ $month: <dateExpression> }
获取周:{ $week: <dateExpression> }
获取时:{ $hour: <dateExpression> }
获取分:{ $minute: <dateExpression> }
获取秒:{ $second: <dateExpression> }
获取毫秒:{ $millisecond: <dateExpression> }
例子:获取出生日期的年月周、时分秒毫秒
db.persons.aggregate([
{
$project: {
"name": 1,
"birth": { $toDate: "$birth" },
"year": { $year: { $toDate: "$birth" } },
"month": { $month: { $toDate: "$birth" } },
"week": { $week: { $toDate: "$birth" } },
"hour": { $hour: { $toDate: "$birth" } },
"minute": { $minute: { $toDate: "$birth" } },
"second": { $second: { $toDate: "$birth" } },
"millisecond": { $millisecond: { $toDate: "$birth" } }
}
}
])
聚合查询的结果如下:
{
"_id" : "1",
"name" : "张三",
"birth" : ISODate("1998-10-20T12:00:00.235Z"),
"year" : 1998,
"month" : 10,
"week" : 42,
"hour" : 12,
"minute" : 0,
"second" : 0,
"millisecond" : 235
}
{
"_id" : "2",
"name" : "李四",
"birth" : ISODate("1993-08-16T20:08:20.890Z"),
"year" : 1993,
"month" : 8,
"week" : 33,
"hour" : 20,
"minute" : 8,
"second" : 20,
"millisecond" : 890
}
六、获取年的第几天、月的第几天、周的第几天
语法:
获取年的第几天:{ $dayOfYear: <dateExpression> }
获取月的第几天:{ $dayOfMonth: <dateExpression> }
获取周的第几天:{ $dayOfWeek: <dateExpression> }
例子:获取年的第几天、月的第几天、周的第几天
db.persons.aggregate([
{
$project: {
"name": 1,
"dayOfYear": { $dayOfYear: { $toDate: "$birth" } },
"dayOfMonth": { $dayOfMonth: { $toDate: "$birth" } },
"dayOfWeek": { $dayOfWeek: { $toDate: "$birth" } }
}
}
])
聚合查询的结果如下:
{
"_id" : "1",
"name" : "张三",
"dayOfYear" : 293,
"dayOfMonth" : 20,
"dayOfWeek" : 3
}
{
"_id" : "2",
"name" : "李四",
"dayOfYear" : 228,
"dayOfMonth" : 16,
"dayOfWeek" : 2
}