MST

星途 面试题库

面试题:MongoDB $unwind与其他聚合操作结合优化复杂查询

有一个电商订单集合orders,每个订单文档包含顾客信息customer,订单商品数组orderItems(每个商品对象包含商品名称、价格、数量等字段),以及订单日期orderDate。现在需要查询出每个顾客购买过的所有商品,并且计算出每个顾客购买商品的总金额,要求在聚合操作中合理使用$unwind阶段与其他聚合操作(如$group、$sum等),同时要考虑性能优化,说明优化思路以及最终的聚合查询语句。
37.9万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. $unwind阶段:使用$unwindorderItems数组展开,这样每个商品项就可以独立进行后续计算,这是计算每个顾客购买商品总金额的基础操作。但要注意,$unwind操作可能会使文档数量大幅增加,影响性能,所以尽量在早期阶段筛选出必要的数据,减少$unwind的输入数据量。
  2. $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操作将每个顾客购买的商品名称收集到一个数组中。