MST

星途 面试题库

面试题:MongoDB聚合管道复杂分组与嵌套操作

在一个名为orders的集合中,每个文档代表一个订单,包含订单编号(orderId)、客户ID(customerId)、订单日期(orderDate)、订单金额(amount)和订单状态(status)字段。请使用聚合管道完成以下任务:按照客户ID分组,统计每个客户的订单总数、总金额,并且筛选出订单总数大于5且总金额大于1000的客户信息,最终按照总金额升序排列。此外,对于每个符合条件的客户,需要在结果中嵌套一个子文档,显示该客户最近一笔订单的日期和金额。
22.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

假设使用的是MongoDB,以下是实现该需求的聚合管道代码:

db.orders.aggregate([
    {
        $group: {
            _id: "$customerId",
            orderCount: { $sum: 1 },
            totalAmount: { $sum: "$amount" },
            latestOrder: {
                $max: {
                    orderDate: "$orderDate",
                    amount: "$amount"
                }
            }
        }
    },
    {
        $match: {
            orderCount: { $gt: 5 },
            totalAmount: { $gt: 1000 }
        }
    },
    {
        $sort: {
            totalAmount: 1
        }
    },
    {
        $project: {
            _id: 0,
            customerId: "$_id",
            orderCount: 1,
            totalAmount: 1,
            latestOrder: 1
        }
    }
])

解释:

  1. $group
    • 使用$sum操作符统计每个客户的订单总数orderCount
    • 使用$sum操作符统计每个客户的总金额totalAmount
    • 使用$max操作符找出每个客户最近一笔订单(通过orderDate的最大值确定),并同时获取该订单的金额。
  2. $match:筛选出订单总数大于5且总金额大于1000的客户。
  3. $sort:按照总金额升序排列。
  4. $project:格式化输出,只保留customerIdorderCounttotalAmountlatestOrder字段,并去掉默认的_id字段(重命名为customerId)。