使用场景
数据库中存的数据类型,不一定是前端需要的类型。比如,数据库中 学生collection(集合|表)
有身份证号码field(字段|列)为idCardNumber,为18位数字string
数据结构如下:
代码语言:ts复制student:{
name:"jacky",
idCardNumber:"620102199503025028"
}
需求:计算出学生的出生年月日,
知道身份证的构成是
11-12 位表出生再哪 一年
11-12 位代表出生的月份
13-14 位代表初日的那天
所以就可以根据身份证的信息算出该学生的出生年月日,那么怎样是用mongodb查询实现呢
请参考以下查询方式
代码案例
案例一:mongodb的聚合函数计算出年月日
代码语言:ts复制let aggregate=[
{
payload:{$substr: ["$idCardNumber", 6, 8]},
//$idCardNumber 含义是查询的字段,6代表的是从第几位开始截取 8,代表要截取几位
brithYear:{
$toInt:{
//$toInt 是mongodb的类型转化工具
$substr:[{$substr: ["$idCardNumber", 6, 8]},0,4]
}
},
brithMonth:{
$toInt:{
$substr:[{$substr: ["$idCardNumber", 6, 8]},4,2]
}
},
brithDay:{
$toInt:{
$substr:[{$substr: ["$idCardNumber", 6, 8]},6,2]
}
},
}]
this.xxxModel.aggregate(aggregate)
*说明下,为啥6代表的第七位,因为stirng可以看作数组,索引位index位是从0开始的,请看 字符串与数组
toInt 只是其中一种类型转化指令,更多转化指令 请看 mongodb convert
案例二:mongodb的 $function计算出生年月日
代码语言:ts复制/**
* specifications: The fields to
* include or exclude.
*/
{
payload:{ $function:
{
body: function(idCardNumber) {
return idCardNumber.substr(6,8)
},
args: [ "$idCardNumber" ],
lang: "js"
}
},
brithYear:{
$toInt: { $function:
{
body: function(idCardNumber) {
return idCardNumber.substr(6,4)
},
args: [ "$idCardNumber" ],
lang: "js"
}
}
},
brithMonth:{
$toInt: { $function:
{
body: function(idCardNumber) {
return idCardNumber.substr(10,2)
},
args: [ "$idCardNumber" ],
lang: "js"
}
}
},
brithDay:{
$toInt: { $function:
{
body: function(idCardNumber) {
return idCardNumber.substr(12,2)
},
args: [ "$idCardNumber" ],
lang: "js"
}
}
},
}
//执行查询后的结果
{
payload:"19010321"
brithYear:1901
brithMonth:3
brithDay:21
}
当然这个用function可能就有些麻烦,如果要处理的数据很复杂要经过多次转化可以考虑这个方法
有疑问欢迎评论区留言
我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!