# 预聚合
## 问题：业绩排名，游戏排名，商品统计等精确统计

- 热销榜：某个商品今天卖了多少，这个星期卖了多少，这个月卖了多少？
- 电影排行：观影者，场次统计
- 传统解决方案：通过聚合计算
- 痛点：消耗资源多，聚合计算时间长

## 解决方案：用预聚合字段

```json
{
    product: "Bike",
    sku: "abc123456”,
    quantitiy: 20394,
    daily_sales: 40,
    weekly_sales: 302,
    monthly_sales: 1419
}
# 更新库存的同时，更新统计字段
db.inventory.update({_id:123},
{$inc: 
        {
            quantity: -1, 
            daily_sales: 1, 
            weekly_sales: 1,
            monthly_sales: 1, 
        } 
}
)
```

## 模式小结：预聚合

| 场景                 | 痛点                     | 设计模式方案及优点                                           |
| -------------------- | ------------------------ | ------------------------------------------------------------ |
| 准确排名<br />排行榜 | 统计计算耗时，计算时间长 | 模型中直接增加统计字段<br />每次更新数据的时候同时更新统计值 |

