如何在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
相关产品推荐
相关产品推荐

