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