报表场景需分层设计:高频固定报表用预聚合嵌入主文档,动态维度报表采用多态文档与稀疏索引,原始明细数据单独按时间分桶存储。避免键值对数组,所有时间字段统一UTC存储,通过报表配置表动态生成聚合管道实现灵活迭代。
users 集合的 report_summary 字段里,用 $inc 原子更新就够用。
user_reports 集合,用 user_id + report_type + date_range 作复合主键$lookup 或应用层关联custom_fields 数组。MongoDB 允许同一集合内文档结构不同,这正是它的优势所在。
{"region":"华东","channel":"小程序"} 或 {"region":"华北","promotion_code":"SUMMER2026"},缺失字段不写,不填 nulldb.sales.createIndex({region: 1, channel: 1}, {sparse: true}),避免为大量缺失字段建无效索引项custom_attributes: [{key:"xxx",value:"yyy"}] 这种键值对数组——查询无法走索引,聚合也得用 $unwind 拖慢性能events_20260706_14、events_20260706_15,用 TTL 索引自动过期({expireAfterSeconds: 2592000})user_id、event_type、timestamp、payload(必要上下文JSON),去掉所有冗余描述字段aggregate() 管道,别用 find() 拉全量——尤其避免在聚合里用 $lookup 关联大集合,先用 $facet 或分步预计算report_configs 集合里存每张报表的字段映射规则,再配合应用层动态生成聚合管道,这才是真正可落地的灵活性。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述