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
相关产品推荐
相关产品推荐

