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

如何在Express.js中通过查询参数对数组内的元素按价格排序

问题原因

你当前代码中调用的.sort()方法作用于Category集合的主查询逻辑,仅能对Category本身的字段进行排序,不会对populate关联查询得到的services子数组内部的元素生效。

解决方法

你需要在populate的配置项中指定关联数据的排序规则,修改代码如下:

const getCategory = async (req, res) => {
  let query;
  const reqQuery = { ...req.query };
  // 提前提取sort参数,避免被筛选逻辑用到
  const sortBy = req.query.sort ? req.query.sort.split(',').join(' ') : '';
  delete reqQuery.sort;

  console.log(req.query);
  if (req.query.name) {
    query = Category.find(reqQuery);
  } else {
    query = Category.find();
  }

  try {
    const populateOpt = { path: 'services' };
    // 存在排序参数时,给关联的services添加排序规则
    if (sortBy) {
      populateOpt.options = { sort: sortBy };
    }
    const categories = await query.populate(populateOpt);
    res.status(200).json({
      message: 'All Category',
      result: categories,
    });
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

注意事项

  • 确保Service模型中的price字段为数字类型,若为字符串类型会按照字符编码顺序排序,无法得到正确的数值排序结果
  • Postman请求时如果需要价格降序,传入参数sort=-price即可,升序传入sort=price

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:24:02