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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:02:36