面试题答案
一键面试假设使用 MongoDB 数据库,以下是实现该需求的聚合管道操作:
db.products.aggregate([
// 步骤1:按类别分组,计算每个类别中产品的平均价格和总库存数量
{
$group: {
_id: "$category",
averagePrice: { $avg: "$price" },
totalQuantity: { $sum: "$quantity" }
}
},
// 步骤2:匹配价格高于平均价格的产品,并计算这些产品的库存总量
{
$lookup: {
from: "products",
localField: "_id",
foreignField: "category",
as: "matchingProducts"
}
},
{
$unwind: "$matchingProducts"
},
{
$match: {
"matchingProducts.price": { $gt: "$averagePrice" }
}
},
{
$group: {
_id: "$_id",
categoryName: { $first: "$_id" },
averagePrice: { $first: "$averagePrice" },
totalStockOfAboveAverage: { $sum: "$matchingProducts.quantity" }
}
},
// 步骤3:重命名_id字段为category
{
$project: {
category: "$categoryName",
averagePrice: 1,
totalStockOfAboveAverage: 1,
_id: 0
}
}
]);
上述管道操作解释:
- $group:按类别分组,计算每个类别产品的平均价格 (
averagePrice
) 和总库存数量 (totalQuantity
)。 - $lookup:使用
$lookup
操作符将每个类别与products
集合连接,找到属于该类别的所有产品。 - $unwind:展开
matchingProducts
数组,以便后续匹配操作。 - $match:匹配价格高于平均价格的产品。
- $group:再次按类别分组,计算这些产品的库存总量 (
totalStockOfAboveAverage
)。 - $project:重命名
_id
字段为category
,并选择显示需要的字段。