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

如何在Mongoose中按ID降序排序,实现最新音乐置顶?

如何在Mongoose中按ID降序排序音乐数据,让最新内容置顶?

你当前的代码问题出在链式调用的顺序上:当你给find()直接传入回调函数时,查询会立即执行,后面的.sort()根本不会生效。咱们来调整一下写法,同时优化错误处理:

修正后的回调式写法

这是基于你原有代码的修改,保证排序逻辑生效:

router.get('/getAllMusic', (req, res) => {
  Music.find({})
    .sort({ _id: -1 }) // 把sort移到find之后、回调之前,确保排序在查询时执行
    .exec((err, musics) => {
      if (err) {
        return res.json({ success: false, message: err.message });
      }
      // find()返回的始终是数组,空数组代表无数据,所以判断长度更准确
      if (!musics.length) {
        return res.json({ success: false, message: "未找到任何音乐数据" });
      }
      res.json({ success: true, musics });
    });
});

几点关键说明:

  • 必须把.sort({ _id: -1 })放在find()和回调之间,这样Mongoose会在查询数据库时就应用排序规则
  • 用.exec()来执行带回调的查询,这是Mongoose官方推荐的写法,避免链式调用的歧义
  • 原代码里的!musics判断不合理,因为find()永远返回数组(无数据时是空数组),所以检查musics.length才正确
  • 返回err.message比直接返回整个错误对象更友好,也避免泄露不必要的信息

更推荐的Async/Await写法

如果你的项目支持ES6+语法,强烈建议用async/await,代码更线性易读,也避免回调嵌套:

router.get('/getAllMusic', async (req, res) => {
  try {
    // 等待查询结果,同时应用排序
    const musics = await Music.find({}).sort({ _id: -1 });
    
    if (!musics.length) {
      return res.json({ success: false, message: "未找到任何音乐数据" });
    }
    
    res.json({ success: true, musics });
  } catch (err) {
    res.json({ success: false, message: err.message });
  }
});

补充说明

为什么按_id降序能得到最新数据?因为Mongoose默认的_id是ObjectId,它的结构里包含了文档创建的时间戳,越新创建的文档,_id的值越大,所以降序排序后,最新的内容自然会排在列表顶部。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:28:48