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

如何在不使用sort的情况下获取Mongoose最新创建的记录

Mongoose获取最新创建记录的替代方案

我们平时常用的sort({ createdAt: -1 })或sort({ _id: -1 })确实是最通用的实现,如果你想要不直接使用sort方法的实现,可以参考以下几种方案:

  • 方案1:把排序逻辑封装到Schema静态方法,业务调用时无需写sort
    如果你只是不想在业务代码里重复写sort逻辑,可以把排序逻辑内聚到模型的静态方法里,定义完成后直接调用封装好的方法即可:
    // 定义Schema时开启timestamps,自动生成createdAt、updatedAt字段
    const demoSchema = new mongoose.Schema({
      // 自定义字段
      title: String,
      content: String
    }, { timestamps: true })
    
    // 新增静态方法,内置排序逻辑
    demoSchema.statics.getLatestRecord = function () {
      return this.findOne().sort({ createdAt: -1 })
    }
    
    const DemoModel = mongoose.model('Demo', demoSchema)
    
    业务侧调用时完全不需要接触sort逻辑:
    // 直接获取最新创建的记录
    const latest = await DemoModel.getLatestRecord()
    
  • 方案2:维护元数据完全跳过排序,适合高并发查询场景
    如果你对性能要求很高,不想每次查询都做排序操作,可以单独维护一个元数据表,每次写入新记录后同步更新最新记录的ID,查询时直接取ID关联即可,全程不需要任何排序操作:
    // 定义元数据表,存储各模型的最新记录ID
    const metaSchema = new mongoose.Schema({
      modelName: String,
      latestRecordId: mongoose.Schema.Types.ObjectId
    })
    const MetaModel = mongoose.model('Meta', metaSchema)
    
    // 写入新记录的逻辑
    const newDemo = await DemoModel.create({ title: '测试', content: '测试内容' })
    // 同步更新元数据的最新记录ID
    await MetaModel.findOneAndUpdate(
      { modelName: 'Demo' },
      { latestRecordId: newDemo._id },
      { upsert: true }
    )
    
    // 查询最新记录时,直接查元数据再关联即可
    const meta = await MetaModel.findOne({ modelName: 'Demo' })
    const latestRecord = await DemoModel.findById(meta.latestRecordId)
    
  • 方案3:分组场景下用$last操作符,无需显式写sort
    如果你需要按某个字段分组后取每组的最新记录,可以用聚合管道的$last操作符,调用层不需要写sort方法:
    // 按category字段分组,取每组的最新记录
    const groupLatest = await DemoModel.aggregate([
      {
        $group: {
          _id: '$category',
          latest: { $last: '$$ROOT' }
        }
      }
    ])
    

补充说明:MongoDB默认生成的_id字段本身包含时间戳信息,如果你没有开启timestamps配置,把排序字段替换为_id也能拿到完全一致的结果。

内容的提问来源于stack exchange,提问作者Kevin Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:18:03