如何使用MongoDB聚合管道合并URL短链文档中重复日期的点击记录并求和日点击量
没问题,我来帮你搞定这个短链点击统计的合并需求。你需要用MongoDB的聚合管道来实现,核心思路是先展开数组、按日期分组求和,再重新组装成你要的结构。下面是完整的实现方案:
MongoDB聚合管道解决方案
完整聚合查询代码
db.yourCollectionName.aggregate([ // 1. 展开dayWiseClicks数组,让每个数组元素成为独立文档条目 { $unwind: "$dayWiseClicks" }, // 2. 按文档ID+日期分组,求和点击量并保留所有其他字段 { $group: { _id: { docId: "$_id", date: "$dayWiseClicks.date" }, // 保留第一个点击条目的_id(和你示例结构一致) clickEntryId: { $first: "$dayWiseClicks._id" }, // 对当日点击量求和 totalDailyClicks: { $sum: "$dayWiseClicks.dailyClicks" }, // 保留文档其他所有字段(用$first取同文档内的唯一值) merchant_name: { $first: "$merchant_name" }, store_id: { $first: "$store_id" }, original_url: { $first: "$original_url" }, url_hash: { $first: "$url_hash" }, subdomain: { $first: "$subdomain" }, totalClicks: { $first: "$totalClicks" }, igClicks: { $first: "$igClicks" }, fbClicks: { $first: "$fbClicks" }, directClicks: { $first: "$directClicks" }, desktopClicks: { $first: "$desktopClicks" }, mobileClicks: { $first: "$mobileClicks" }, createdAt: { $first: "$createdAt" }, updatedAt: { $first: "$updatedAt" }, __v: { $first: "$__v" } } }, // 3. 重新构造dayWiseClicks数组并恢复原始文档ID { $addFields: { dayWiseClicks: [{ date: "$_id.date", dailyClicks: "$totalDailyClicks", _id: "$clickEntryId" }], _id: "$_id.docId" } }, // 4. 清理临时字段 { $project: { clickEntryId: 0, totalDailyClicks: 0 } } ])
步骤详解
- $unwind阶段:把
dayWiseClicks数组拆分成独立文档,比如原来3条同日期的条目会变成3个单独的文档,方便后续分组处理。 - $group阶段:
- 用「原始文档ID+日期」作为分组键,确保同一个短链下的同日期点击被合并。
$sum计算当日总点击量,$first保留其他字段的唯一值(因为同个原始文档的这些字段都是相同的),同时保留第一个点击条目的_id匹配你的示例结构。
- $addFields阶段:重新组装
dayWiseClicks数组,把分组后的日期、总点击量和保留的条目ID放进去,同时恢复原始文档的_id。 - $project阶段:删掉分组过程中产生的临时字段,让最终文档结构更简洁。
自定义提示
- 记得把
yourCollectionName替换成你实际的集合名称。 - 如果只需要处理特定短链,在最前面加一个
$match阶段过滤:{ $match: { _id: ObjectId("61f6322cd3e3484d97a25e7c") } } - 如果你的Schema后续新增字段,要在
$group阶段用$first把新字段也加进去,保证文档完整性。
内容的提问来源于stack exchange,提问作者Shahriar
相关产品推荐
相关产品推荐

