如何用MongoDB聚合获取names数组中changed_at最新的3条集合文档
问题原因
你原来的聚合逻辑错误出在分组步骤:对拆分排序后的names按文档_id分组后,之前的全局排序规则会失效,后续取$limit:3是随机返回3个分组后的文档,并不是按changed_at最新的规则返回的。
正确写法
根据你的实际需求分两种场景:
场景1:返回全局所有name变更记录里最新的3条(允许同个文档出现多次,只要它的多个name变更都排在全局前3)
直接移除多余的$group步骤即可:
[ { $unwind: '$names' }, { $sort: { 'names.changed_at': -1 } }, { $limit: 3 }, { $lookup: { from: 'users', localField: 'id', foreignField: 'id', as: 'user', }, }, { $unwind: '$user' }, { $project: { _id: 0, old_name: '$names', user: { avatar_url: 1, current_tag: 1 }, }, }, ]
场景2:返回3个不同的文档,每个文档取自身最新的name变更,且这3个文档是所有文档里name更新时间最新的
需要在分组后新增一次排序步骤:
[ { $unwind: '$names' }, { $sort: { 'names.changed_at': -1 } }, { $group: { _id: '$_id', latest_name: { $first: '$names' }, id: { $first: '$id' }, }, }, // 分组后要重新按最新变更时间排序,否则排序规则会失效 { $sort: { 'latest_name.changed_at': -1 } }, { $limit: 3 }, { $lookup: { from: 'users', localField: 'id', foreignField: 'id', as: 'user', }, }, { $unwind: '$user' }, { $project: { _id: 0, old_name: '$latest_name', user: { avatar_url: 1, current_tag: 1 }, }, }, ]
内容的提问来源于stack exchange,提问作者user16976770
相关产品推荐
相关产品推荐

