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

MongoDB如何按键值数组information中指定key的value排序?

按嵌套数组指定key的value排序实现方法

你的文档结构里information是键值对数组,直接用普通排序语法没法指定数组里的特定key排序,得用MongoDB的聚合管道来处理,步骤如下:

  • 提取指定key对应的value到临时字段
    用$addFields阶段,通过$filter筛选数组中匹配目标key的元素,再用$arrayElemAt取出对应value,生成可用于排序的顶层字段。

  • 基于临时字段排序
    用$sort阶段对生成的临时字段设置排序规则。

  • (可选)清理临时字段
    如果不需要保留临时字段,用$project阶段移除它们。

完整聚合示例代码

db.collection.aggregate([
  // 提取需要排序的字段到顶层
  {
    $addFields: {
      emailSort: {
        $getField: {
          field: "value",
          input: { $arrayElemAt: [
            { $filter: {
                input: "$information",
                cond: { $eq: ["$$this.key", "email"] }
              }
            },
            0
          ]}
        }
      },
      registrationDateSort: {
        $getField: {
          field: "$date",
          input: { $getField: {
              field: "value",
              input: { $arrayElemAt: [
                { $filter: {
                    input: "$information",
                    cond: { $eq: ["$$this.key", "registrationDate"] }
                  }
                },
                0
              ]}
            }
          }
        }
      }
    }
  },
  // 执行排序:email升序,registrationDate降序
  {
    $sort: {
      emailSort: 1,
      registrationDateSort: -1
    }
  },
  // 可选:移除临时排序字段
  {
    $project: {
      emailSort: 0,
      registrationDateSort: 0
    }
  }
])

代码说明

  • $filter:遍历information数组,筛选出key等于目标值的元素
  • $arrayElemAt: [..., 0]:取出筛选结果数组的第一个元素(假设每个key在数组中唯一)
  • $getField:逐层提取嵌套字段的实际值,日期类型直接取$date对应的时间戳
  • $sort:按临时字段设置排序方向,1是升序,-1是降序
  • $project:最后移除临时字段,保持原文档结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:42:09