/v2/summary 接口查询语句和数据统计方法详解

本文档详细解释了 /v2/summary 接口使用的查询语句和数据统计方法。

1. 查询语句

对于请求 /v2/summary?postId=6ff59f85-6b2b-486c-a7e6-33d1a1979da9&startDate=2025-11-25&endDate=2025-12-02&zoneId=America/Los_Angeles,系统会执行以下 MongoDB 查询:

1.1 查询条件

{
  "postId": "6ff59f85-6b2b-486c-a7e6-33d1a1979da9",
  "date": {
    "$gte": "2025-11-25",
    "$lte": "2025-12-02"
  }
}

这个查询会在名为 prodUserActivitySummary_America/Los_Angeles_v2 的集合中查找匹配的文档。

1.2 完整的聚合管道

系统使用 MongoDB 的聚合管道(Aggregation Pipeline)来处理数据,聚合管道包含以下阶段:

  1. 匹配阶段 ($match)

    {
      $match: {
        "postId": "6ff59f85-6b2b-486c-a7e6-33d1a1979da9",
        "date": {
          "$gte": "2025-11-25",
          "$lte": "2025-12-02"
        }
      }
    }
    
  2. 分组汇总阶段 ($group)

    {
      $group: {
        _id: null,
        summary: {
          $accumulator: {
            init: function() {
              return {
                uniqueVisitors: 0,
                engaged: 0,
                viewedProduct: 0,
                clickedAddToCart: 0,
                clickedBuyNow: 0,
                initiatedCheckout: 0,
                placedOrder: 0,
                addedToCart: 0,
                orderQuantity: 0,
                device: {},
                platform: {},
                ui: {}
              };
            },
            accumulate: function(summary, record) {
              // 累加各项指标
              if (record["uniqueVisitors"] > 0) summary["uniqueVisitors"] += record["uniqueVisitors"];
              if (record["engaged"] > 0) summary["engaged"] += record["engaged"];
              if (record["viewedProduct"] > 0) summary["viewedProduct"] += record["viewedProduct"];
              if (record["clickedAddToCart"] > 0) summary["clickedAddToCart"] += record["clickedAddToCart"];
              if (record["clickedBuyNow"] > 0) summary["clickedBuyNow"] += record["clickedBuyNow"];
              if (record["initiatedCheckout"] > 0) summary["initiatedCheckout"] += record["initiatedCheckout"];
              if (record["addedToCart"] > 0) summary["addedToCart"] += record["addedToCart"];
              if (record["placedOrder"] > 0) summary["placedOrder"] += record["placedOrder"];
              if (record["orderQuantity"] > 0) summary["orderQuantity"] += record["orderQuantity"];
    
              // 合并设备分布统计
              for (const key in record.device) {
                if (summary.device[key]) {
                  summary.device[key] += record.device[key];
                } else {
                  summary.device[key] = record.device[key];
                }
              }
    
              // 合并平台分布统计
              for (const key in record.platform) {
                if (summary.platform[key]) {
                  summary.platform[key] += record.platform[key];
                } else {
                  summary.platform[key] = record.platform[key];
                }
              }
    
              // 合并UI分布统计
              for (const key in record.ui) {
                if (summary.ui[key]) {
                  summary.ui[key] += record.ui[key];
                } else {
                  summary.ui[key] = record.ui[key];
                }
              }
              return summary;
            },
            accumulateArgs: ["$$CURRENT"],
            merge: function(summary, record) {
              // 与accumulate函数相同,用于合并多个聚合节点的结果
              // 实现逻辑略...
            }
          }
        }
      }
    }
    
  3. 结果展开阶段 ($project)

    {
      $project: {
        _id: false,
        uniqueVisitors: "$summary.uniqueVisitors",
        engaged: "$summary.engaged",
        viewedProduct: "$summary.viewedProduct",
        clickedAddToCart: "$summary.clickedAddToCart",
        clickedBuyNow: "$summary.clickedBuyNow",
        initiatedCheckout: "$summary.initiatedCheckout",
        addedToCart: "$summary.addedToCart",
        placedOrder: "$summary.placedOrder",
        orderQuantity: "$summary.orderQuantity",
        device: "$summary.device",
        platform: "$summary.platform",
        ui: "$summary.ui"
      }
    }
    

2. 数据统计来源

2.1 原始数据收集

系统中的数据来自于用户的实际行为,包括:

  • 浏览文章 (USER_ACTIVITY_POST_ACCESS)
  • 查看商品 (USER_ACTIVITY_POST_VIEWED_PRODUCT)
  • 点击购物车 (USER_ACTIVITY_POST_CLICK_ADD_TO_CART)
  • 点击立即购买 (USER_ACTIVITY_POST_CLICK_BUY_NOW)
  • 发起结账 (USER_ACTIVITY_CHECKOUT_INITIATED)
  • 下订单 (USER_ACTIVITY_ORDER_PLACED)
  • 等等...

2.2 数据处理流程

  1. 原始用户活动数据 (UserActivity)

    • 存储最原始的用户行为数据
  2. 处理后的用户活动数据 (ProcessedUserActivity)

    • 对原始数据进行清洗、去重、会话识别等处理
    • 为每个用户行为打上标签,如是否为唯一访客、是否互动等
  3. 详细统计数据 (UserActivityStatistic)

    • 基于处理后的数据,按用户、会话等维度生成详细的行为统计数据
    • 每条记录代表一个用户在一个会话中的行为统计
  4. 汇总数据 (UserActivitySummary)

    • 对详细统计数据按日期、文章等维度进行汇总
    • 这就是 /v2/summary 接口查询的数据源

2.3 汇总统计方法

对于请求的时间范围内,系统会对每个匹配的记录进行如下统计:

  1. 访客统计

    • uniqueVisitors: 唯一访客数
    • engaged: 互动用户数(进行了除访问外的其他行为)
    • viewedProduct: 查看商品用户数
    • clickedAddToCart: 点击加购按钮用户数
    • clickedBuyNow: 点击立即购买按钮用户数
    • initiatedCheckout: 发起结账流程用户数
    • addedToCart: 添加到购物车用户数
    • placedOrder: 下单用户数
    • orderQuantity: 订单数量
  2. 分布统计

    • device: 不同设备类型的访问次数分布
    • platform: 不同平台的访问次数分布
    • ui: 不同UI组件的交互次数分布

3. 示例数据结构

查询返回的数据结构类似于:

{
  "uniqueVisitors": 1250,
  "engaged": 860,
  "viewedProduct": 420,
  "clickedAddToCart": 180,
  "clickedBuyNow": 95,
  "initiatedCheckout": 150,
  "addedToCart": 210,
  "placedOrder": 75,
  "orderQuantity": 92,
  "device": {
    "Windows": 620,
    "Android": 380,
    "iOS": 250
  },
  "platform": {
    "Facebook": 780,
    "Instagram": 320,
    "TikTok": 150
  },
  "ui": {
    "button_add_to_cart": 180,
    "button_buy_now": 95,
    "product_image": 420
  }
}

4. 总结

/v2/summary 接口通过 MongoDB 的聚合管道功能,对预处理好的汇总数据进行二次聚合计算,得出指定时间范围和条件下的统计数据。这种方式避免了每次请求都进行大量的实时计算,大大提高了查询性能。

results matching ""

    No results matching ""