MongoDB聚合查询:获取按字母排序的去重爱好列表
解决MongoDB聚合去重后爱好列表的排序问题
你当前的聚合管道用$addToSet虽然能实现去重,但$addToSet是无序的,无法直接生成排序后的数组。可以通过两种方式达成需求:
方法一:兼容旧版本MongoDB(无版本限制)
通过两次分组+排序的逻辑实现:
db.users.aggregate([ // 拆分hobbies数组,每个爱好生成独立文档 { $unwind: "$hobbies" }, // 按爱好分组,自动完成去重 { $group: { _id: "$hobbies" } }, // 按爱好名称升序排序(1代表升序,-1代表降序) { $sort: { _id: 1 } }, // 将排序后的爱好收集到result数组中 { $group: { _id: null, result: { $push: "$_id" } } } ])
方法二:MongoDB 5.0+ 简洁写法
利用$sortArray操作符直接对去重后的数组排序:
db.users.aggregate([ { $unwind: "$hobbies" }, { $group: { _id: null, result: { $addToSet: "$hobbies" } } }, // 对result数组按元素升序排序 { $project: { result: { $sortArray: { input: "$result", sortBy: 1 } } } } ])
两种方法最终都会输出符合要求的结果:
{ "_id": null, "result": ["code", "eat", "read", "sleep", "swim"] }
内容的提问来源于stack exchange,提问作者MayAsk
相关产品推荐
相关产品推荐

