如何在不使用sort的情况下获取Mongoose最新创建的记录
Mongoose获取最新创建记录的替代方案
我们平时常用的sort({ createdAt: -1 })或sort({ _id: -1 })确实是最通用的实现,如果你想要不直接使用sort方法的实现,可以参考以下几种方案:
- 方案1:把排序逻辑封装到Schema静态方法,业务调用时无需写sort
如果你只是不想在业务代码里重复写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)// 直接获取最新创建的记录 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
相关产品推荐
相关产品推荐

