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

Mongoose查询sort排序功能不生效问题求助

问题原因

  • 核心错误是你在调用Plot.find()的时候提前加了await关键字:
    • 不加await时Plot.find()返回的是Mongoose Query实例,内置sort()、limit()等链式调用方法,可以后续拼接查询逻辑
    • 你加了await之后,query变量直接被赋值为查询返回的文档数组,原生JS数组没有Mongoose的sort()方法,调用就会抛出异常,这就是你报错的根本原因
  • 后续你再次对已经是数组的query执行await也属于多余操作,不会返回预期结果

解决方案

把Plot.find()前的await去掉,等所有链式查询逻辑(排序、分页、字段筛选等)拼接完成后,再统一执行await获取最终结果。

修正后代码

exports.getAllFamilyPlots = async (req, res) => {
  try {
    //BUILD QUERY
    const queryObj = { ...req.query };
    const excludedFields = ['page', 'sort', 'limit', 'fields'];
    excludedFields.forEach((el) => delete queryObj[el]);

    let queryStr = JSON.stringify(queryObj);
    queryStr = queryStr.replace(/\b(gte|gt|lte|lt)\b/g, (match) => `$${match}`);

    // 移除此处的await,保留Mongoose Query实例用于后续链式调用
    let query = Plot.find(JSON.parse(queryStr));

    //SORTING
    if (req.query.sort) {
      query = query.sort(req.query.sort);
      // 如需倒序排序,请求参数传入sort=-size即可
    }
    // 所有查询逻辑拼接完成后,统一await执行得到最终结果
    const plots = await query;

    res.status(200).json({
      status: 'success',
      results: plots.length,
      data: {
        plots,
      },
    });
  } catch (err) {
    res.status(404).json({
      status: 'fail',
      message: err,
    });
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:36:02