查询策略
- 筛选最近一周的数据:利用
$match
阶段筛选出timestamp
在最近一周内的文档。需要获取当前日期并减去一周的时间,以此作为筛选条件。
- 按用户ID分组并计算交易总金额:使用
$group
阶段,以user_id
作为分组依据,计算每个用户的交易金额总和。
- 按交易总金额降序排序:通过
$sort
阶段,按照交易总金额进行降序排列。
- 取前10名:利用
$limit
阶段,只返回排名前10的用户信息。
命令
var oneWeekAgo = new Date();
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);
db.transactions.aggregate([
{
$match: {
timestamp: { $gte: oneWeekAgo }
}
},
{
$group: {
_id: "$user_id",
totalAmount: { $sum: "$amount" }
}
},
{
$sort: {
totalAmount: -1
}
},
{
$limit: 10
}
]);
性能优化措施
- 索引优化:
- 在
timestamp
字段上创建索引,加速$match
阶段的筛选操作。例如:db.transactions.createIndex({timestamp: 1})
。
- 在
user_id
和amount
字段上创建复合索引,对于$group
阶段按user_id
分组并计算amount
总和可能有帮助,例如:db.transactions.createIndex({user_id: 1, amount: 1})
。
- 分区:考虑对集合进行分区,按时间(如按天、周等)分区,这样在查询最近一周数据时,可以减少需要扫描的数据量。
- 使用覆盖索引:如果查询结果只包含
user_id
和totalAmount
,确保索引覆盖了这些字段,这样查询可以直接从索引中获取数据,避免回表操作,提高查询性能。