mongodb $toInt如何实现数据类型的转化并完成排序

2024-01-19 19:28:00 浏览数 (1)

使用场景

数据库中存的数据类型,不一定是前端需要的类型。比如,数据库中 学生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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞