首页 > 解决方案 > MongoDB - 最近 20 个独特的

问题描述

我试图从 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

解决方案


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

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

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

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

这将返回唯一的文档,但如果您只需要没有限制的最新文档,unique那么只需将$group阶段删除为多余的,并且会成倍地消耗性能。如果您仍然需要unique性能更好的文档,那么您需要做出与时间相关的决定,即$match大于过去 1 小时、$group它们$sort$limit前 20 小时的文档。


推荐阅读