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

