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

MongoDB如何基于嵌套对象数组指定title的value对文档排序

解决方案

你的现有查询执行$unwind拆分数组后未保留原始文档结构,也没有还原数组,导致返回结果丢失了fields数组的其他元素。可以通过新增临时排序键的方式实现需求,无需拆分原数组,性能更优:

最优写法(MongoDB 4.4+ 适用)

db.test.aggregate([
  // 新增临时排序字段,提取fields数组中title为firstName对应的value
  {
    $addFields: {
      sortKey: {
        $getField: {
          field: "value",
          input: {
            $first: {
              $filter: {
                input: "$fields",
                cond: { $eq: ["$$this.title", "firstName"] }
              }
            }
          }
        }
      }
    }
  },
  // 按提取的排序字段升序排列
  { $sort: { sortKey: 1 } },
  // 删除临时字段,返回原始文档结构
  { $unset: "sortKey" }
])

低版本兼容写法(MongoDB 3.2+ 适用)

如果你的MongoDB版本较低不支持$getField、$first操作符,可以使用保留原始文档后再筛选排序的方式实现:

db.test.aggregate([
  // 暂存完整的原始文档
  { $addFields: { originalDoc: "$$ROOT" } },
  { $unwind: "$fields" },
  // 匹配排序用的字段项
  { $match: { "fields.title": "firstName" } },
  // 按对应值排序
  { $sort: { "fields.value": 1 } },
  // 还原返回原始文档结构
  { $replaceRoot: { newRoot: "$originalDoc" } }
])

两种写法返回的结果都保留了完整的fields数组,完全符合预期输出要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:27:03