You are here

Nodejs + mongoose拼音排序

g089h515r806 的头像
Submitted by g089h515r806 on 星期一, 2020-01-27 08:47

作者:亚艾元技术部

   客户想按照部门的名称拼音排序,但是数据库中,我仅仅存储了中文名字,为了排序,我需要增加一个字段。

const departmentSchema = new Schema({
 ...
  //部门名称
  name: {
    type: String,
       index: true
  },
  //部门名称拼音
  pinyin: {
    type: String,
       index: true
  }, 
...

 

   我们需要一个程序,将名称字段转为拼音,保存起来,读取数据库的时候,按照拼音字段排序即可。在Drupal中,有transliteration模块可以使用,在nodejs中,也有一个同样的模块,这个模块是我以前的同时胡一凡写的,andyhu这次在项目中,终于用到了这个模块,以前andy曾经给我说过,写这个nodejs的模块的时候,就借鉴了Drupal里面的transliteration模块,部分代码就是从Drupal里面拷贝的。

 

Mongoose保存之前,支持使用钩子,有pre save可以使用。

 

我们先安装transliteration模块:

npm install transliteration –save

 

接着,引用

import { slugify } from 'transliteration';

 

编写pre钩子:

departmentSchema.pre('save', function(next) {
    var department = this;
       var name = department.name || '';
       //var pinyin = department.pinyin || '';
    department.pinyin = slugify(name, { lowercase: true, separator: '_' });
       next();
 
});

 

这是保存,需要注意的是,monggose的钩子和Drupal有一点不一样,更新的时候,需要实现一个单独的钩子:

departmentSchema.pre('findOneAndUpdate', function(next){
    var name = this._update.name || '';
       this._update.pinyin = slugify(name, { lowercase: true, separator: '_' });
       next();    
});

 

通过程序,测试,拼音字段成功生成。按照拼音排序:

ctx.body = await Department.find(condition).sort({pinyin: 'asc'}).exec();

 

在程序中检测,正常。按照名称的拼音排序,问题就得到了圆满解决。


论坛: