You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:27:03