MST

星途 面试题库

面试题:MongoDB Shell中的聚合操作与性能优化

在MongoDB Shell中,有一个销售记录集合`sales`,每个文档包含`productId`(产品ID,字符串)、`quantity`(销售数量,数字)和`price`(销售单价,数字)。要求使用聚合操作计算每个产品的总销售额(`totalRevenue = quantity * price`),并按总销售额从高到低排序。同时,阐述在大数据量情况下,如何优化该聚合操作的性能。
21.0万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

聚合操作代码

db.sales.aggregate([
    {
        $group: {
            _id: "$productId",
            totalRevenue: { $sum: { $multiply: ["$quantity", "$price"] } }
        }
    },
    {
        $sort: {
            totalRevenue: -1
        }
    }
]);

大数据量性能优化

  1. 索引优化
    • productIdquantityprice字段创建复合索引。如果数据主要按productId聚合,可创建以productId为前缀的复合索引,如db.sales.createIndex({productId: 1, quantity: 1, price: 1})。这样在$group操作时,能利用索引快速定位和分组数据。
  2. 分块处理
    • 对于大数据量,可以将数据按productId范围分成多个块。例如,根据productId的哈希值或者productId的字符范围进行分块。对每个块分别进行聚合操作,最后再将各个块的聚合结果汇总并排序。这可以减少单次聚合操作的数据量,提高性能。
  3. 使用内存优化
    • 合理分配MongoDB服务器的内存,确保聚合操作有足够的内存可用。MongoDB在执行聚合操作时,会尽可能在内存中处理数据。如果内存不足,部分数据需要写入磁盘,这会显著降低性能。可以通过调整--wiredTigerCacheSizeGB等参数来优化内存使用。
  4. 执行计划分析
    • 使用explain方法分析聚合操作的执行计划,如db.sales.aggregate([...]).explain()。根据执行计划的结果,针对性地调整索引、优化管道操作顺序等,以提高性能。