You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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从字符串转为整数类型,一劳永逸:

  1. 先执行一次数据迁移脚本,更新存量数据:
// 该脚本仅需运行一次,运行前建议先备份数据库
Wasabi.updateMany(
  // 匹配所有publicationDate为字符串类型的文档
  { publicationDate: { $type: "string" } },
  // 批量转换为整数类型
  [{ $set: { publicationDate: { $toInt: "$publicationDate" } } }]
).then(res => {
  console.log(`更新完成,共修改${res.modifiedCount}条数据`);
}).catch(err => {
  console.error("更新失败", err);
})
  1. 修改你的Wasabi模型对应字段定义:
const WasabiSchema = new mongoose.Schema({
  // 其余字段保持不变
  publicationDate: {
    type: Number, // 把原来的String改为Number
    required: true
  }
})
  1. 修改后的查询逻辑更简洁,直接调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:36:02