MST

星途 面试题库

面试题:MongoDB管道操作之复杂分组与计算

在名为 'products' 的集合中,每个文档包含 'product_name'(产品名)、'category'(类别)、'price'(价格)和 'quantity'(库存数量)字段。请使用管道操作,统计每个类别中价格高于该类别平均价格的产品的库存总量,同时显示该类别名称以及平均价格。
16.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

假设使用 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
        }
    }
]);

上述管道操作解释:

  1. $group:按类别分组,计算每个类别产品的平均价格 (averagePrice) 和总库存数量 (totalQuantity)。
  2. $lookup:使用 $lookup 操作符将每个类别与 products 集合连接,找到属于该类别的所有产品。
  3. $unwind:展开 matchingProducts 数组,以便后续匹配操作。
  4. $match:匹配价格高于平均价格的产品。
  5. $group:再次按类别分组,计算这些产品的库存总量 (totalStockOfAboveAverage)。
  6. $project:重命名 _id 字段为 category,并选择显示需要的字段。