NestJS+MongoDB:按指定Category匹配的Position字段排序文档
解决NestJS中MongoDB按指定分类的position字段排序问题
直接用'categories.positionAccordingToCategory'排序时,MongoDB会默认取数组第一个元素的对应字段值,不管该元素是否匹配你指定的category ID,这就是多元素数组排序混乱的原因。
不用聚合查询的话,可以通过$expr结合数组操作符,在排序阶段动态提取匹配目标category的position字段值:
const targetCategoryId = '这里替换成你的目标category ID'; // 注意要和文档里的category字段类型一致,比如ObjectId await this.myModel .find({ // 其他筛选条件 categories: { $elemMatch: { category: targetCategoryId } }, }) .sort({ $expr: { $desc: { $getField: { field: 'positionAccordingToCategory', input: { $arrayElemAt: [ { $filter: { input: '$categories', cond: { $eq: ['$$this.category', targetCategoryId] } } }, 0 ] } } } } })
代码说明:
$filter:从categories数组中筛选出category等于目标ID的元素(因为前面用了$elemMatch,所以筛选结果至少有一个元素)$arrayElemAt:取出筛选后的第一个元素(唯一匹配的那个)$getField:提取该元素的positionAccordingToCategory字段值$desc:按这个值降序排列
如果你的MongoDB版本低于5.0(不支持$getField),可以换成点语法的写法:
.sort({ $expr: { $desc: { $arrayElemAt: [ { $map: { input: { $filter: { input: '$categories', cond: { $eq: ['$$this.category', targetCategoryId] } } }, in: '$$this.positionAccordingToCategory' } }, 0 ] } } })
这个方案不需要用聚合管道,只是在find的sort阶段使用表达式计算排序键,完全符合你的需求。
内容的提问来源于stack exchange,提问作者M Nouman
相关产品推荐
相关产品推荐

