作者:亚艾元技术部
客户想按照部门的名称拼音排序,但是数据库中,我仅仅存储了中文名字,为了排序,我需要增加一个字段。
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();
在程序中检测,正常。按照名称的拼音排序,问题就得到了圆满解决。