小程序云开发:云数据库聚合查询实战指南

聚合查询是云数据库处理复杂数据统计的核心功能,通过多阶段管道操作实现高效数据聚合。以下为完整实战流程:


一、聚合查询核心概念
  1. 聚合管道

    • 由多个阶段(stage)组成,数据按顺序流经各阶段处理
    • 每个阶段对数据进行过滤、分组、排序等操作
    • 基本结构:db.collection('orders').aggregate().stage1().stage2().end()
  2. 常用阶段操作符

    操作符功能说明示例
    $match数据筛选(类似WHERE){ $match: { status: 1 } }
    $group分组统计{ $group: { _id: "$category" } }
    $project字段重塑(类似SELECT){ $project: { name: 1 } }
    $sort结果排序{ $sort: { price: -1 } }
    $limit限制返回数量{ $limit: 10 }

二、实战案例:统计商品销售数据

场景需求
统计每个商品类别的:

  1. 总销售额
  2. 平均单价
  3. 最高/最低单价

数据库结构

// orders集合示例文档
{
  "product": "手机",
  "category": "电子产品",
  "price": 2999,
  "quantity": 2,
  "order_time": "2023-06-15"
}

聚合查询代码

const db = wx.cloud.database()
const _ = db.command

db.collection('orders').aggregate()
  .match({  // 阶段1:筛选有效订单
    order_time: _.gte('2023-01-01')
  })
  .group({  // 阶段2:按类别分组统计
    _id: '$category',
    totalSales: $.sum('$price'), 
    avgPrice: $.avg('$price'),
    maxPrice: $.max('$price'),
    minPrice: $.min('$price')
  })
  .project({  // 阶段3:重塑输出字段
    _id: 0,
    category: '$_id',
    totalSales: 1,
    avgPrice: { $round: ['$avgPrice', 2] }, // 保留两位小数
    priceRange: ['$minPrice', '$maxPrice']
  })
  .sort({ totalSales: -1 }) // 阶段4:按销售额降序
  .limit(5)  // 阶段5:取TOP5
  .end()
  .then(res => console.log(res))
  .catch(err => console.error(err))

输出结果示例

[
  {
    "category": "电子产品",
    "totalSales": 89970,
    "avgPrice": 2999.00,
    "priceRange": [1999, 5999]
  },
  {
    "category": "家居用品",
    "totalSales": 35680,
    "avgPrice": 178.40,
    "priceRange": [59, 399]
  }
]


三、性能优化技巧
  1. 索引加速

    • match阶段使用的字段建立索引
    db.collection('orders').createIndex({ order_time: 1 })
    

  2. 管道顺序优化

    • 优先使用$match减少后续处理数据量
    • $project$unset尽早移除无用字段
  3. 内存控制

    • 单阶段处理数据不超过100MB
    • 大数据集使用$limit分段处理

注意:聚合查询结果默认最多返回16MB数据,需分页时使用$skip$limit组合实现


四、常见错误排查
  1. 字段不存在错误

    • 使用$ifNull设置默认值:
    .project({
      price: { $ifNull: ['$price', 0] }
    })
    

  2. 数据类型错误

    • 使用$convert转换类型:
    .project({
      quantity: { $convert: { input: '$quantity', to: 'int' } }
    })
    

  3. 超时问题

    • 在云函数中设置超时上限(最长60秒)
    • 复杂查询拆分为多个子聚合

通过实战掌握聚合管道设计,可高效实现商业数据分析、报表生成等高级功能。

更多推荐