MST

星途 面试题库

面试题:MongoDB聚合框架表达式性能优化与复杂场景处理

在一个拥有海量文档的MongoDB集合中,文档包含产品信息(productInfo),其中有价格(price)、销量(salesVolume)、评论数量(reviewCount)等字段。现在要通过聚合框架实现以下复杂需求:首先筛选出价格大于一定阈值且评论数量与销量比值大于某个比例的产品;然后按照产品类别进行分组,计算每个类别下产品的平均价格、总销量以及平均评论数量;最后按照平均价格从高到低排序,并仅返回前10条数据。同时,要考虑如何优化聚合操作以提高性能。请详细阐述实现思路并写出完整的聚合管道表达式。
50.4万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 筛选阶段:使用$match操作符,根据价格大于阈值以及评论数量与销量比值大于某个比例筛选出符合条件的文档。
    • 分组阶段:使用$group操作符,按产品类别进行分组,计算每个类别下产品的平均价格、总销量以及平均评论数量。
    • 排序阶段:使用$sort操作符,按照平均价格从高到低排序。
    • 限制阶段:使用$limit操作符,仅返回前10条数据。
    • 性能优化
      • 在筛选条件的字段(如pricesalesVolumereviewCount)上创建复合索引,这样在$match阶段可以利用索引快速定位符合条件的文档,减少扫描的数据量。
  2. 聚合管道表达式
[
    {
        $match: {
            price: { $gt: <价格阈值> },
            $expr: {
                $gt: [ { $divide: [ "$reviewCount", "$salesVolume" ] }, <评论数量与销量比值> ]
            }
        }
    },
    {
        $group: {
            _id: "$productCategory",
            averagePrice: { $avg: "$price" },
            totalSalesVolume: { $sum: "$salesVolume" },
            averageReviewCount: { $avg: "$reviewCount" }
        }
    },
    {
        $sort: {
            averagePrice: -1
        }
    },
    {
        $limit: 10
    }
]

在上述表达式中,<价格阈值><评论数量与销量比值>需要根据实际需求替换为具体数值。同时,productCategory是假设文档中产品类别的字段名,实际需根据集合结构调整。