面试题答案
一键面试优化思路
- $unwind阶段:使用
$unwind
将orderItems
数组展开,这样每个商品项就可以独立进行后续计算,这是计算每个顾客购买商品总金额的基础操作。但要注意,$unwind
操作可能会使文档数量大幅增加,影响性能,所以尽量在早期阶段筛选出必要的数据,减少$unwind
的输入数据量。 - $group阶段:通过
$group
按照顾客信息customer
进行分组,以便统计每个顾客购买商品的总金额。在$group
阶段使用$sum
累加器来计算总金额,这样能高效地完成计算。
聚合查询语句
db.orders.aggregate([
// 筛选出必要的数据,减少后续操作的数据量(如有需要)
// 展开orderItems数组
{ $unwind: "$orderItems" },
// 按customer分组,并计算总金额
{
$group: {
_id: "$customer",
totalAmount: { $sum: { $multiply: ["$orderItems.price", "$orderItems.quantity"] } },
allProducts: { $push: "$orderItems.productName" }
}
}
]);
在上述聚合查询中:
$unwind
操作将orderItems
数组展开,使每个商品项成为独立的文档。$group
操作按照customer
进行分组,使用$sum
和$multiply
计算每个顾客购买商品的总金额,$push
操作将每个顾客购买的商品名称收集到一个数组中。