MongoDB聚合管道中如何排序数组内文档且保持结构不变
MongoDB聚合管道中对数组内文档排序的解决方案
普通的$sort阶段仅针对集合中的顶层文档排序,无法直接处理数组内部元素的排序逻辑,因此你之前尝试的两种写法都无法达到预期效果。要在不修改原有文档结构的前提下完成Transactions数组的排序,可根据MongoDB版本选择以下方案:
推荐方案(MongoDB 4.2+):使用$sortArray操作符
$sortArray是MongoDB 4.2新增的专门用于数组内部排序的操作符,可直接在$addFields或$set阶段中更新目标数组的排序结果,完全保留原有文档结构:
{ $addFields: { Transactions: { $sortArray: { input: "$Transactions", // 引用当前文档的Transactions数组 sortBy: { TransactionDateTime: 1 } // 1为升序,-1为降序 } } } }
或使用$set($addFields的别名,效果一致):
{ $set: { Transactions: { $sortArray: { input: "$Transactions", sortBy: { TransactionDateTime: 1 } } } } }
兼容旧版本方案(MongoDB <4.2):$unwind+$sort+$group组合
如果你的MongoDB版本低于4.2,可通过临时拆解数组、排序后重组的方式实现,最终也能保留原有文档结构:
[ // 拆解Transactions数组为单个文档 { $unwind: "$Transactions" }, // 按TransactionDateTime对拆解后的文档排序 { $sort: { "Transactions.TransactionDateTime": 1 } }, // 重新组合文档,恢复原有结构 { $group: { _id: "$_id", agentInstr: { $first: "$agentInstr" }, Transactions: { $push: "$Transactions" } } } ]
此方案需注意:大数据量下性能略低于$sortArray,优先推荐使用前者。
内容的提问来源于stack exchange,提问作者mWang
相关产品推荐
相关产品推荐

