小程序云开发:云数据库聚合查询实战
·
小程序云开发:云数据库聚合查询实战指南
聚合查询是云数据库处理复杂数据统计的核心功能,通过多阶段管道操作实现高效数据聚合。以下为完整实战流程:
一、聚合查询核心概念
-
聚合管道
- 由多个阶段(stage)组成,数据按顺序流经各阶段处理
- 每个阶段对数据进行过滤、分组、排序等操作
- 基本结构:
db.collection('orders').aggregate().stage1().stage2().end()
-
常用阶段操作符
操作符 功能说明 示例 $match数据筛选(类似WHERE) { $match: { status: 1 } }$group分组统计 { $group: { _id: "$category" } }$project字段重塑(类似SELECT) { $project: { name: 1 } }$sort结果排序 { $sort: { price: -1 } }$limit限制返回数量 { $limit: 10 }
二、实战案例:统计商品销售数据
场景需求
统计每个商品类别的:
- 总销售额
- 平均单价
- 最高/最低单价
数据库结构
// 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]
}
]
三、性能优化技巧
-
索引加速
- 在
match阶段使用的字段建立索引
db.collection('orders').createIndex({ order_time: 1 }) - 在
-
管道顺序优化
- 优先使用
$match减少后续处理数据量 $project和$unset尽早移除无用字段
- 优先使用
-
内存控制
- 单阶段处理数据不超过100MB
- 大数据集使用
$limit分段处理
注意:聚合查询结果默认最多返回16MB数据,需分页时使用
$skip和$limit组合实现
四、常见错误排查
-
字段不存在错误
- 使用
$ifNull设置默认值:
.project({ price: { $ifNull: ['$price', 0] } }) - 使用
-
数据类型错误
- 使用
$convert转换类型:
.project({ quantity: { $convert: { input: '$quantity', to: 'int' } } }) - 使用
-
超时问题
- 在云函数中设置超时上限(最长60秒)
- 复杂查询拆分为多个子聚合
通过实战掌握聚合管道设计,可高效实现商业数据分析、报表生成等高级功能。
更多推荐
所有评论(0)