MST

星途 面试题库

面试题:MongoDB聚合框架中条件表达式在嵌套和多阶段聚合中的深度应用

假设有两个集合,一个是products集合,文档结构为{product_id: 'string', product_name: 'string', category: 'string', price: 'number'};另一个是orders集合,文档结构为{order_id: 'string', customer_id: 'string', order_date: 'date', order_items: [ { product_id: 'string', quantity: 'number' } ]}。现在要通过聚合操作,找出每个类别中,在2023年10月1日之后下单金额最高的产品信息(包括产品ID、名称、价格)。下单金额通过orders集合中的order_items结合products集合中的价格计算得出。请详细编写聚合管道,需要考虑多个集合关联、复杂条件筛选以及多阶段聚合处理。
11.3万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

以下是MongoDB中实现该需求的聚合管道:

[
    // 步骤1:展开orders集合中的order_items数组
    {
        $unwind: "$order_items"
    },
    // 步骤2:通过product_id将orders集合与products集合进行左连接
    {
        $lookup: {
            from: "products",
            localField: "order_items.product_id",
            foreignField: "product_id",
            as: "product_info"
        }
    },
    // 步骤3:展开lookup后的product_info数组
    {
        $unwind: "$product_info"
    },
    // 步骤4:筛选出2023年10月1日之后的订单
    {
        $match: {
            order_date: { $gt: new Date("2023-10-01") }
        }
    },
    // 步骤5:计算每个订单商品的下单金额
    {
        $addFields: {
            order_amount: { $multiply: ["$product_info.price", "$order_items.quantity"] }
        }
    },
    // 步骤6:按category分组,找出每个类别中下单金额最高的产品
    {
        $group: {
            _id: "$product_info.category",
            max_order_amount: { $max: "$order_amount" },
            product_id: { $first: "$product_info.product_id" },
            product_name: { $first: "$product_info.product_name" },
            price: { $first: "$product_info.price" }
        }
    },
    // 步骤7:重命名_id字段为category
    {
        $project: {
            category: "$_id",
            product_id: 1,
            product_name: 1,
            price: 1,
            _id: 0
        }
    }
]
  1. $unwind: 展开orders集合中的order_items数组,以便后续处理每个订单中的商品。
  2. $lookup: 通过product_idorders集合与products集合进行左连接,将匹配的产品信息添加到结果文档中。
  3. $unwind: 展开lookup操作后生成的product_info数组。
  4. $match: 筛选出order_date在2023年10月1日之后的订单。
  5. $addFields: 计算每个订单商品的下单金额,通过产品价格和购买数量相乘。
  6. $group: 按产品类别分组,找出每个类别中下单金额最高的产品,并保留其product_idproduct_nameprice
  7. $project: 重命名_id字段为category,并去除_id字段,使结果文档结构更清晰。