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

Express中Mongoose查询MongoDB最后一条文档结果异常如何解决

问题根因

Mongoose 所有查询方法默认返回的是 Query 查询对象实例,而非直接的数据库返回结果。你当前代码没有等待异步查询执行完成,直接打印Query实例,自然会看到冗长的模型相关对象,拿不到目标文档。

修复方案

Mongoose 查询是异步IO操作,必须通过await或者.then()接收最终执行结果,推荐两种常用写法:

async/await写法(Express项目首选)

在路由/业务处理函数前加async关键字,查询语句前加await等待结果返回。查单条文档优先用findOne,不需要额外加limit(1):

// 路由使用示例
app.get('/last-token', async (req, res) => {
  try {
    const lastDoc = await FM_Model.findOne().sort({ $natural: -1 })
    console.log('Last Token from MONGODB here -> ', lastDoc)
    res.json(lastDoc)
  } catch (err) {
    res.status(500).json({ error: err.message })
  }
})

Promise链式调用写法

如果不想使用async语法,可以直接调用Query实例的then方法获取结果:

FM_Model.findOne().sort({ $natural: -1 })
  .then(lastDoc => {
    console.log('Last Token from MONGODB here -> ', lastDoc)
  })
  .catch(err => {
    console.error('查询出错:', err)
  })
补充排查点
  • 如果坚持用find().limit(1)的写法,加await后返回的是长度为1的文档数组,需要取第一个元素才是目标文档:
    const [lastDoc] = await FM_Model.find().limit(1).sort({ $natural: -1 })
    
  • 若$natural排序不符合预期,可以换成按_id倒序排序,效果完全一致:MongoDB默认生成的ObjectId自带插入时间戳,天然按写入顺序排序,写法为.sort({ _id: -1 }),兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:18:26