MST

星途 面试题库

面试题:MongoDB中first与last累加器函数在复杂时间序列分析场景的运用

有一个MongoDB集合记录了服务器在不同时间点的性能指标,文档包含时间戳(timestamp)、CPU使用率(cpuUsage)、内存使用率(memoryUsage)。现在需要分析一段时间内服务器的性能趋势,使用first和last累加器函数结合其他聚合操作,找出每个服务器在这段时间内CPU使用率和内存使用率的最大变化差值,并按照差值从大到小排序,给出详细的聚合思路和代码实现。
33.3万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. 聚合思路

    • 阶段一:匹配指定时间段:使用$match操作符筛选出给定时间段内的文档。
    • 阶段二:按服务器分组:因为题目没明确提及如何标识服务器,假设文档中有serverId字段用于标识服务器,使用$group操作符按serverId分组。
    • 阶段三:获取每个服务器CPU和内存使用率的起始和结束值:在$group阶段,使用$first$last累加器函数分别获取每个服务器在时间段内CPU使用率和内存使用率的第一个(起始)和最后一个(结束)值。
    • 阶段四:计算变化差值:计算CPU和内存使用率的结束值与起始值的差值。
    • 阶段五:按差值排序:使用$sort操作符按计算出的差值从大到小排序。
  2. 代码实现(假设集合名为serverPerformance,时间段为startTimeendTime

db.serverPerformance.aggregate([
    // 匹配指定时间段
    {
        $match: {
            timestamp: {
                $gte: startTime,
                $lte: endTime
            }
        }
    },
    // 按服务器分组
    {
        $group: {
            _id: "$serverId",
            startCPUUsage: { $first: "$cpuUsage" },
            endCPUUsage: { $last: "$cpuUsage" },
            startMemoryUsage: { $first: "$memoryUsage" },
            endMemoryUsage: { $last: "$memoryUsage" }
        }
    },
    // 计算变化差值
    {
        $addFields: {
            cpuUsageDiff: { $subtract: ["$endCPUUsage", "$startCPUUsage"] },
            memoryUsageDiff: { $subtract: ["$endMemoryUsage", "$startMemoryUsage"] }
        }
    },
    // 按差值排序
    {
        $sort: {
            cpuUsageDiff: -1,
            memoryUsageDiff: -1
        }
    }
]);