问题背景
在做小淘喵数据筛选功能的时候,发现按照价格或者券额降序排序的时候,接口给出来的数据排序并没有真正按照价格或券额的大小进行降序排序。原以为数字的字符串类型和数值类型是一样的,结果被打脸了。
修复方案
想到的解决方案有两个:
- 将表字段的数据类型做调整,改成数值类型;
- 在查询的时候,将字段类型进行转换;
采用第1种方案的话,除了将表字段的类型做调整外,还得在数据写入数据表的接口上面对数据的类型进行转换。虽然调整的工作量不大,但如果表数据存了很大数据,又或者线上一直在跑业务,这样做无疑会对线上产生很大影响。如此一来就只能选择方案2了,在出表展示的时候做处理。
好在Sequelize有个cast方法,可以将查询的字段类型进行转换,使用如下:
Sequelize.cast(Sequelize.col(colunName) [, DataType])
如此一来,我们便可在ORDER BY时进行处理:
model.findAndCountAll({
attributtes: ['price', 'sales', 'coupon'],
limit: 20,
offset: 0,
order: [[ Sequelize.cast(Sequelize.col('coupon'), 'INTEGER'), 'DESC']],
})
经过这样处理后,再去看看接口输出的数据排序,已经是正常了。
思考
在创建表的时候,其实就需要先想好入表的数据字段类型是什么。有时候为了图方便,尤其是在导表遇到表格字段特别多时,最好是不要产生偷懒情绪。不然,坑挖了,总是会要填的!
本文暂时没有评论,来添加一个吧(●'◡'●)