实时物化视图:用 $merge 实现秒级销售漏斗聚合
利用聚合管道的 $merge 阶段将增量计算结果写入物化集合,替代 MapReduce · 难度:入门 · +10XP
实时物化视图:用 $merge 实现秒级销售漏斗聚合
物化视图在传统数据库中很常见,但 MongoDB 直到 4.2 才通过 $merge 原生支持。本教程摒弃 ETL 轮询,直接在一个聚合管道里完成:从原始事件集合读取点击流数据,按用户分桶、计算每个阶段的转化率,最后用 $merge 将结果 upsert 到物化集合。当新事件插入时,通过 Change Stream 触发该管道,即可保持视图持续刷新,延迟小于1秒,适合实时大屏。
db.raw_events.aggregate([
{ $match: { timestamp: { $gte: new Date(Date.now() - 60000) } } },
{ $group: { _id: '$user_id', stages: { $push: '$event' } } },
{ $project: { funnel: { $reduce: { input: '$stages', initialValue: { view:0, click:0, pay:0 }, in: { ... } } } } },
{ $merge: { into: 'funnel_mv', on: '_id', whenMatched: 'replace', whenNotMatched: 'insert' } }
]);