如何编写MongoDB聚合查询:特定用户ID的统计与最大日期查询
MongoDB聚合查询实现你的需求
没问题,我帮你写一条能同时满足三个需求的MongoDB聚合查询语句,下面是完整的代码和详细解释:
db.yourCollection.aggregate([ // 第一步:筛选指定用户ID的数据 { $match: { user_id: { $in: ["111b/c", "111a"] } } }, // 第二步:使用$facet并行执行两个聚合任务 { $facet: { // 任务1:统计light_pad等于20的记录总数 totalLightPad20: [ { $match: { light_pad: 20 } }, { $count: "count" } ], // 任务2:获取每个用户ID对应的最大日期数据 userLatestData: [ // 按日期降序排序,确保最新的记录排在前面 { $sort: { date: -1 } }, // 注意:替换成你实际的日期字段名,比如create_time/update_time // 按用户ID分组,取每组的第一条(也就是最新日期的记录) { $group: { _id: "$user_id", latestRecord: { $first: "$$ROOT" } } }, // 将最新记录转为根文档,方便查看 { $replaceRoot: { newRoot: "$latestRecord" } } ] } } ])
关键部分解释:
- $match阶段:先过滤出目标用户的数据,减少后续聚合的处理量。注意用户ID包含
/,直接作为字符串写入$in数组即可,MongoDB会准确匹配。 - $facet阶段:这是核心,它允许我们在一个聚合管道中同时执行多个独立的聚合任务,完美解决你既要统计总数又要获取每个用户最新数据的需求。
- totalLightPad20分支:先再次过滤出
light_pad=20的记录,再用$count统计数量。 - userLatestData分支:先按日期降序排序,这样每个用户的最新记录会排在最前面;然后按用户ID分组,用
$first: "$$ROOT"获取每组的第一条完整记录(也就是最大日期的那条);最后用$replaceRoot把嵌套的最新记录转为顶层文档,结构更清晰。
注意事项:
- 把
yourCollection替换成你实际的集合名称。 - 把
date替换成你数据中存储日期的字段名(比如create_time、update_time等)。 - 如果你的日期字段是字符串格式,确保它是可排序的ISO格式(比如
"2024-05-20T10:30:00Z"),否则$sort可能无法正确按日期排序。
内容的提问来源于stack exchange,提问作者VARUN
相关产品推荐
相关产品推荐

