Node.js Mongoose如何将publicationDate字符串转数字实现按年份排序
解决方案
针对你的需求,有两种实现路径,可根据你的业务场景选择:
方案1:查询时临时转换(无需修改原有数据)
如果你不想改动现有数据库的存储结构,仅需要在本次查询时转换类型后排序,可直接使用Mongoose聚合查询实现,替换原有find逻辑即可:
app.get("/getAlbumData.json", (req, res) => { Wasabi.aggregate([ // 先筛选符合条件的文档,缩小处理范围提升性能 { $match: { publicationDate: { $in: ['2009','2010','2011','2012','2013','2014','2015','2016'] } } }, // 新增数字类型的年份字段,也可直接覆盖原有publicationDate字段 { $addFields: { publicationYear: { $toInt: "$publicationDate" } } }, // 按年份排序,1为升序,-1为降序 { $sort: { publicationYear: 1 } }, // 限制返回条数 { $limit: 200 } ], function (err, doc) { if (err) return res.status(500).send(err); res.send(doc); res.end(); }) })
方案2:永久修改字段类型(推荐长期使用)
如果后续还要频繁使用该字段做数值计算、排序等操作,建议直接把数据库中所有文档的publicationDate从字符串转为整数类型,一劳永逸:
- 先执行一次数据迁移脚本,更新存量数据:
// 该脚本仅需运行一次,运行前建议先备份数据库 Wasabi.updateMany( // 匹配所有publicationDate为字符串类型的文档 { publicationDate: { $type: "string" } }, // 批量转换为整数类型 [{ $set: { publicationDate: { $toInt: "$publicationDate" } } }] ).then(res => { console.log(`更新完成,共修改${res.modifiedCount}条数据`); }).catch(err => { console.error("更新失败", err); })
- 修改你的Wasabi模型对应字段定义:
const WasabiSchema = new mongoose.Schema({ // 其余字段保持不变 publicationDate: { type: Number, // 把原来的String改为Number required: true } })
- 修改后的查询逻辑更简洁,直接调用
sort方法即可:
app.get("/getAlbumData.json",(req,res)=> { // 注意$in里的查询条件也要同步改为数字类型 Wasabi.find( {publicationDate: { $in: [2009,2010,2011,2012,2013,2014,2015,2016] } }) .sort({ publicationDate: 1 }) .limit(200) .exec(function (err, doc) { if (err) return res.status(500).send(err); res.send(doc); res.end(); }) })
注意事项
如果你的publicationDate字段存在非数字格式的异常字符串,可使用$convert操作符加错误处理逻辑跳过异常数据,避免转换报错。
内容的提问来源于stack exchange,提问作者scandll
相关产品推荐
相关产品推荐

