MongoDB嵌套数组排序:如何用Mongoose对指定角色的分数排序
解决Mongoose聚合中指定角色scores数组排序问题
你当前的聚合代码无法实现目标的原因是:$sort: { "characters.scores.score": -1 }是对整个characters文档进行排序,而非对scores数组内部的元素排序。要完成指定角色的scores数组按分数降序排列,可按以下两种方案调整聚合管道:
方案一:MongoDB 5.2+ 推荐(使用$sortArray)
利用$sortArray操作符直接对数组内部元素排序,步骤简洁高效:
const personal = await culvertSchema.aggregate([ // 匹配包含目标角色的文档 { $match: { "characters.name": selectedCharacter } }, // 展开characters数组 { $unwind: "$characters" }, // 筛选出指定名称的角色 { $match: { "characters.name": selectedCharacter } }, // 对scores数组按score降序排序 { $addFields: { "characters.scores": { $sortArray: { input: "$characters.scores", sortBy: { score: -1 } } } } }, { $limit: 1 } ]);
方案二:兼容旧版本MongoDB(无$sortArray时)
如果你的MongoDB版本低于5.2,可通过展开-排序-重组的方式实现:
const personal = await culvertSchema.aggregate([ { $match: { "characters.name": selectedCharacter } }, { $unwind: "$characters" }, { $match: { "characters.name": selectedCharacter } }, // 展开scores数组 { $unwind: "$characters.scores" }, // 按score降序排序 { $sort: { "characters.scores.score": -1 } }, // 重组scores数组 { $group: { _id: "$_id", characters: { $first: { name: "$characters.name", scores: { $push: "$characters.scores" } } } } } ]);
内容的提问来源于stack exchange,提问作者Hypo
相关产品推荐
相关产品推荐

