mongodb - 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 项活动?
解决方案
您需要首先找到唯一值,然后应用限制,最后按您想要的方式排序。它是您正确订购的解决方案:
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 小时的文档。
推荐阅读
- spring - 运行两个 Spring Boot 实例
- formula - Netsuite - 保存的搜索:显示可用的套件
- airflow - 如何将气流日志写入 Elasticsearch?
- ruby-on-rails - Rails 5 - 无法验证 CSRF 令牌的真实性 - 只有有时
- android - 当我尝试将数据从一个活动传递到另一个活动时,我的应用程序崩溃了
- node.js - 将 req.body 中的空字符串 ''" 替换为 null/undefined
- java - 将 main 方法中的变量与另一个 Java 方法连接起来
- react-native - AppCenter Yarn 1.19 错误从缓存中获取时完整性不正确
- html - 如何均匀分布
- 使用 Flexbox 的导航栏中的项目?HTML
- javascript - 使用 Javascript 变量设置 HTML 属性?