如何在Mongo聚合管道中按自定义指定顺序排序字符串?
按指定自定义顺序排序MongoDB聚合结果
要实现按你指定的任意顺序对聚合结果排序,核心思路是给每个目标_id分配一个排序优先级数值,再基于这个数值排序。具体可以通过以下聚合阶段实现:
基础实现方案
直接用$addFields添加一个临时排序字段,结合$indexOfArray获取每个_id在自定义顺序数组中的索引,再用$sort按这个索引排序:
db.collection.aggregate([ // 这里放你之前的聚合阶段,输出包含_id和value的文档 { $addFields: { sortKey: { $indexOfArray: [ ['CD', 'AA', 'EF', 'BC'], '$_id' ] } } }, { $sort: { sortKey: 1 } }, { $project: { sortKey: 0 } // 可选,移除临时生成的排序字段 } ])
$indexOfArray会返回对应_id在自定义数组中的位置索引,比如CD对应0、AA对应1,排序时就会严格遵循你指定的顺序。
处理不在指定列表中的文档
如果聚合结果里存在不在你指定顺序列表中的_id,$indexOfArray会返回-1,这类文档会排在最前面。要是想让它们排到最后,可以用$cond给这类文档分配一个较大的优先级数值:
db.collection.aggregate([ // 前置聚合阶段 { $addFields: { sortKey: { $cond: { if: { $in: ['$_id', ['CD', 'AA', 'EF', 'BC']] }, then: { $indexOfArray: [ ['CD', 'AA', 'EF', 'BC'], '$_id' ] }, else: 9999 // 用大数值让这类文档排最后 } } } }, { $sort: { sortKey: 1 } }, { $project: { sortKey: 0 } } ])
内容的提问来源于stack exchange,提问作者B Seven
相关产品推荐
相关产品推荐

