面试题答案
一键面试实现原理
- 数据筛选:通过
$match
操作符筛选出过去一周内的销售数据。可以通过$gte
(大于等于)和$lt
(小于)操作符结合当前日期计算出一周前的日期来实现。 - 分组统计:使用
$group
操作符按category
进行分组,并对每个分组内的amount
进行求和,得出每个产品类别的总销售额。 - 性能优化及分页处理:为了减少数据库查询压力,确保在
sales.date
字段上建立索引。对于分页问题,可以使用$skip
和$limit
操作符。
详细脚本代码
// 计算一周前的日期
var oneWeekAgo = new Date();
oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);
// 确保在 sales.date 字段上建立索引
db.collection('your_collection_name').createIndex({'sales.date': 1});
// 聚合查询
var pipeline = [
{
$unwind: '$sales'
},
{
$match: {
'sales.date': {
$gte: oneWeekAgo
}
}
},
{
$group: {
_id: '$category',
totalSales: {
$sum: '$sales.amount'
}
}
},
// 分页示例,这里假设跳过0条记录,限制返回10条记录
{
$skip: 0
},
{
$limit: 10
}
];
var result = db.collection('your_collection_name').aggregate(pipeline);
result.forEach(function(doc) {
printjson(doc);
});
在上述代码中:
oneWeekAgo
计算出一周前的日期。createIndex
在sales.date
字段上建立索引以提高查询性能。$unwind
操作符将sales
数组展开,以便后续操作。$match
筛选出过去一周内的销售数据。$group
按category
分组并计算总销售额。$skip
和$limit
用于分页,示例中跳过0条记录并限制返回10条记录,实际应用中可以根据需求调整。最后通过forEach
遍历输出结果。