【问题标题】:MongoDB - Most Recent 20 uniqueMongoDB - 最近 20 个独特的
【发布时间】:2026-01-12 17:35:01
【问题描述】:

我试图从 MongoDB 中的集合中获取最新的唯一值,但是,$group 似乎以某种方式破坏了 $sort。即,在这种情况下,我试图获取用户的最新活动(但总共只返回 20 个活动)。

db.activities.aggregate([{ $sort: { timestamp:-1, firstname: 1 } }, { $limit: 20 }])

如果我运行上述操作,我会以正确的顺序返回 20 个结果,但是,由于用户提交了多个活动,我有多个名称相同的文档。

如果我运行以下命令,则第一个查询中的*用户不再在列表中。我得到了完全不同的一群人。

db.activities.aggregate([{ $sort: { timestamp:-1, firstname: 1 } },  { $group: { _id: "$firstname"} } , { $limit: 20 }])

如何获取每人最近的活动,但仅限于 20 个活动?

【问题讨论】:

  • 按组排序。

标签: mongodb


【解决方案1】:

您需要首先找到唯一值,然后应用限制,最后按您想要的方式排序。它是您正确订购的解决方案:

db.activities.aggregate([  
     { $group: { _id: "$firstname"} } , 
     { $limit: 20 },
     { $sort: { timestamp:-1, firstname: 1 } },
])

编辑:上面的代码不会返回正确的结果,因为来自docs $group 不尊重排序。相反,您应该在选择前 20 个之前$sort 他们,如下所示:

db.activities.aggregate([  
     { $group: { _id: "$firstname"} } ,
     { $sort: { timestamp:-1, firstname: 1 } },
     { $limit: 20 },
])

这将返回 unique 文档,但如果您只需要 recent 没有 unique 约束的文档,那么只需删除 $group 阶段作为其冗余,并将成倍地消耗性能.如果您仍然需要性能更好的unique 文档,那么您需要做出与时间相关的决定,即$match 大于过去 1 小时的文档、$group 他们、$sort$limit 前 20 个。

【讨论】:

  • 这对性能有何影响,在我的示例中,有问题的集合在一周内获得了 11,000 条记录(随着它越来越受欢迎,它会呈指数增长)。另外,由于每个人都在做一项活动,我想要最近活动的详细信息。如果我首先将它们分组,这是否不会限制我获取最新活动的能力,因为我只会获取最先出现的内容?
最近更新 更多