TS 聚合查询 读取MongoDB
对服务器节点的 [cpu, rem, cpuG] 等数据进行读取和管理操作。这类记录下用到的若干TS方法。
主要参考这里的 聚合查询语法。
/** * InfoManager1.ts * * 对服务器节点的 [cpu, rem, cpuG] 等数据进行读取和管理操作 * * Author:henry * Date:20200508 * */ import * as DATA_TYPE_STRUCT from './dataTypeStruct' import { Mongo } from "lib/ts-server/core/db" import { _, sleep, now, newDate } from "lib/ts-utils/utils" //"2020-05-05 13:35:13" /**时间间隔 */ let TimeGap = { /**实时 数据,取最近 10 分钟 */ ss: 1000 * 60 * 15, /**分钟 数据,取最近 0 分钟...最新需求是下架这个分钟功能 */ m: 1000 * 60 * 60, /**小时 数据,取最近 1 小时 */ h: 1000 * 60 * 60 * 1, /**天 数据,取最近 24 小时 */ d: 1000 * 60 * 60 * 24 } /**客户端点击某个节点,弹出了实时页面之后,new 一个 Machine 类 */ export class CInfoManagerMongo { private constructor() { } /**节点的若干新,用于丰富界面显示内容 */ private static machineInfo = <DATA_TYPE_STRUCT.MachineInfo>{}; private static reqDataNum = <DATA_TYPE_STRUCT.DataNumber>{}; private static mongoInfo = <DATA_TYPE_STRUCT.MONGODB_INFO>{}; /**实时、分钟、小时、天的数据 */ private static machineData_ss = {}; private static machineData_m = {}; private static machineData_h = {}; private static machineData_d = {}; /**设置显示的数据条数 */ private static serverNodeMachineInit() { this.reqDataNum.SS_number = 40; this.reqDataNum.M_number = 60; this.reqDataNum.H_number = 60; this.reqDataNum.D_number = 100; } /**设置当前服务器节点的 若干新(名称、ip等),客户端展示可能会用到 */ private static setMachineInfo(info: DATA_TYPE_STRUCT.MachineInfo) { this.machineInfo.ip = "127.0.0.1"; //TODO:待完成 } /**设置连接的数据库信息 */ private static async setMongoInfo(nodeID: number) { let subName = _.dateString(_.now()); //server_usage-2020-05 subName = subName.substring(0, 7);//摘取 年月 this.mongoInfo.dbName = `$log.server_usage-${subName}`; this.mongoInfo.collection = "srv_" + `${nodeID}`; console.log(_.logger('INFO'), "setMongoInfo dbName:", this.mongoInfo.dbName, ",collection:", this.mongoInfo.collection); this.serverNodeMachineInit(); } /**处理客户端的请求,cpu,rem, cpuG数据,数据在MongoDB */ static async HandleClientReq(clientReqDataParmas: DATA_TYPE_STRUCT.ClientReqDataParmas) { /**设置表明和数据库名...后面用到数据库查询的时候,会用到这里的变量。主要是做一个数据的临时存储*/ await this.setMongoInfo(clientReqDataParmas.nodeID); if (DATA_TYPE_STRUCT.DataType.SS == clientReqDataParmas.dataType) { return await this.searchMachineDataSS(clientReqDataParmas); } else if (DATA_TYPE_STRUCT.DataType.M == clientReqDataParmas.dataType) { return await this.searchMachineDataM(clientReqDataParmas); } else if (DATA_TYPE_STRUCT.DataType.H == clientReqDataParmas.dataType) { return await this.searchMachineDataH(clientReqDataParmas); } else if (DATA_TYPE_STRUCT.DataType.D == clientReqDataParmas.dataType) { return await this.searchMachineDataD(clientReqDataParmas); } else { console.error(_.logger('ERROR'), `HandleClientReq() some error..`, clientReqDataParmas) return null; } } /**实时 数据...服务器配置里面控制请求条数*/ /** * db:数据库名称 * collection:表的名称 * reqState:第一次请求还是非第一次请求。 * 请求由客户端主动发起 * 这是http协议,无状态、服务器是不能主动给客户端发数据的.服务器只能响应客户端请求. */ static async searchMachineDataSS(clientReqDataParmas: DATA_TYPE_STRUCT.ClientReqDataParmas) { if (DATA_TYPE_STRUCT.DataReqState.FIRSTTIME == clientReqDataParmas.reqState) { let oldTimeStamp = _.dateString(_.now() - TimeGap.ss, 'S') let startTime = new Date(); let retData1 = await Mongo.find(this.mongoInfo.dbName, this.mongoInfo.collection, { time: { "$gte": oldTimeStamp } }, { sort: { _id: -1 }, limit: this.reqDataNum.SS_number }); let endTime = new Date(); console.log(_.logger('INFO'), "searchMachineDataSS query cost times1:", endTime.getTime() - startTime.getTime(), ",dataLength:", retData1.length); if(0 === retData1.length){ console.log(_.logger('WARN'), "searchMachineDataSS [cpu,rem,cpuG] NO DATA RETURN"); } return retData1; } else { if (!clientReqDataParmas.reqTimesGap || clientReqDataParmas.reqTimesGap < 0) { console.error(_.logger('ERROR'), `searchMachineDataSS() `, clientReqDataParmas); throw new Error("client Time gap error!!!"); } let oldTimeStamp = _.dateString(_.now() - clientReqDataParmas.reqTimesGap, 'S') let startTime = new Date(); let retData1 = await Mongo.find(this.mongoInfo.dbName, this.mongoInfo.collection, { time: { "$gte": oldTimeStamp } }, { sort: { _id: -1 }, limit: this.reqDataNum.SS_number }); let endTime = new Date(); console.log(_.logger('INFO'), "searchMachineDataSS query cost times2:", endTime.getTime() - startTime.getTime(), ",dataLength:", retData1.length); return retData1; } } /**查询 分钟 数据*/ // /**目前暂不区分第一次还是第N次 */ static async searchMachineDataM(clientReqDataParmas: DATA_TYPE_STRUCT.ClientReqDataParmas) { let tempNowTime = new Date(); let tempNowTimeStamp = _.dateString(tempNowTime); let oldTimeStamp = _.dateString(tempNowTime.getTime() - TimeGap.m, 'S'); let startTime = new Date(); let retData1 = await Mongo.aggregate(this.mongoInfo.dbName, this.mongoInfo.collection, [ { $match: { time: { $gte: oldTimeStamp, $lt: tempNowTimeStamp } } }, //"2020-05-03 20:29:45" {//2020-04-28 11:58 $project: { minute: { $substr: ["$time", 0, 16] }, cpu: '$cpu', rem: '$rem', cpuG: '$cpuG', } }, { $group: { _id: "$minute", cpu: { $max: '$cpu' }, rem: { $max: '$rem' }, cpuG: { $max: '$cpuG' }, }, }, { $sort: { _id: -1 } }, { $limit: this.reqDataNum.M_number } ]); console.log(_.logger('INFO'), "searchMachineDataM query cost times:", new Date().getTime() - startTime.getTime(), ",dataLength:", retData1.length); return retData1; } /**查询 小时 数据*/ static async searchMachineDataH(clientReqDataParmas: DATA_TYPE_STRUCT.ClientReqDataParmas) { let tempNowTime = new Date(); let tempNowTimeStamp = _.dateString(tempNowTime); let oldTimeStamp = _.dateString(tempNowTime.getTime() - TimeGap.h, 'S'); let startTime = new Date(); let retData1 = await Mongo.aggregate(this.mongoInfo.dbName, this.mongoInfo.collection, [ { $match: { time: { $gte: oldTimeStamp, $lt: tempNowTimeStamp } } }, //"2020-05-03 20:29:45" {//"2020-05-03 20:29"取16个字符,每1分钟取样一次 $project: { hour: { $substr: ["$time", 0, 16] }, cpu: '$cpu', rem: '$rem', cpuG: '$cpuG' } }, { $group: { _id: "$hour", cpu: { $max: '$cpu' }, rem: { $max: '$rem' }, cpuG: { $max: '$cpuG' }, } }, { $sort: { _id: -1 } }, { $limit: this.reqDataNum.H_number } ]); console.log(_.logger('INFO'), "searchMachineDataH query cost times:", new Date().getTime() - startTime.getTime(), ",dataLength:", retData1.length); return retData1; } /**查询 天 数据*/ static async searchMachineDataD(clientReqDataParmas: DATA_TYPE_STRUCT.ClientReqDataParmas) { let tempNowTime = new Date(); let tempNowTimeStamp = _.dateString(tempNowTime); let oldTimeStamp = _.dateString(tempNowTime.getTime() - TimeGap.d, 'S'); let startTime = new Date(); let retData1 = await Mongo.aggregate(this.mongoInfo.dbName, this.mongoInfo.collection, [ { $match: { time: { $gte: oldTimeStamp, $lt: tempNowTimeStamp } } }, //"2020-05-03 20:29:45" {//"2020-05-03 20:2"取15个字符,每10分钟取样一次 $project: { day: { $substr: ["$time", 0, 15] }, cpu: '$cpu', rem: '$rem', cpuG: '$cpuG' } }, { $group: { _id: "$day", cpu: { $max: '$cpu' }, rem: { $max: '$rem' }, cpuG: { $max: '$cpuG' }, } }, { $sort: { _id: -1 } }, { $limit: this.reqDataNum.D_number } ]); console.log(_.logger('INFO'), "searchMachineDataD query cost times:", new Date().getTime() - startTime.getTime(), ",dataLength:", retData1.length); return retData1; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?