MST
星途 面试题库

面试题:MongoDB高性能内嵌文档设计与查询优化专家题

在一个MongoDB集合orders中,文档记录订单信息,包含客户信息(姓名、联系方式),订单详情内嵌文档数组,每个数组元素记录商品信息(商品名称、价格、数量)以及该商品的订单状态(已发货、未发货等)。假设数据量非常大,现要实现一个高效查询:找出购买过‘商品A’且购买数量超过10件的所有客户,并且要求在查询性能上有较好的优化,阐述你的设计思路和查询优化方案,并写出具体的查询语句。
40.3万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. 设计思路
    • 利用MongoDB的索引来提高查询性能。因为数据量非常大,合适的索引能显著加快查询速度。
    • 对于此查询,我们需要在订单详情数组中的商品名称和数量字段上创建复合索引,这样能加快对购买特定商品且数量满足条件的文档的查找。
  2. 查询优化方案
    • 创建复合索引:在orders集合上,对orderDetails.productNameorderDetails.quantity字段创建复合索引。
    • 利用$unwind操作符展开订单详情数组,这样后续可以直接对展开后的文档进行条件匹配。
    • 使用$match阶段来过滤出满足购买‘商品A’且购买数量超过10件的文档。
    • 最后使用$group操作符来聚合出所有满足条件的客户。
  3. 具体查询语句
db.orders.aggregate([
    {
        $unwind: "$orderDetails"
    },
    {
        $match: {
            "orderDetails.productName": "商品A",
            "orderDetails.quantity": { $gt: 10 }
        }
    },
    {
        $group: {
            _id: null,
            customers: {
                $push: {
                    name: "$customer.name",
                    contact: "$customer.contact"
                }
            }
        }
    }
]);

上述查询语句通过$unwind展开订单详情数组,$match过滤条件,$group聚合出满足条件的客户信息。同时为了优化查询性能,建议提前在orders集合上创建如下复合索引:

db.orders.createIndex({ "orderDetails.productName": 1, "orderDetails.quantity": 1 });