每次连接MongoDB时如何在表中保存时间并统计连接次数
实现步骤
你可以按照以下方式修改代码,实现连接自动记录和次数统计,先修正原有代码里的笔误(原代码conststate缺少空格会触发语法错误):
1. 核心实现思路
- 基于Mongoose的
connected事件监听连接状态,该事件会在首次连接成功、断线重连成功时稳定触发,不会遗漏连接场景 - 用专门的集合存储连接记录/统计数据,写入逻辑放在连接成功的回调中
- 累计连接次数可以通过两种方式实现:每次插入一条连接日志后统计文档总数,或者用原子操作自增维护单独的计数字段
2. 基础实现代码(日志全量存储)
这种方式会留存每一次连接的时间记录,方便后续做连接时间分析,累计次数直接统计文档总数即可,逻辑简单不易出错:
const express = require('express'); const mongoose = require('mongoose'); const bodyParser = require('body-parser'); const app = express(); const dbState = [ { value: 0, label: 'disconnected' }, { value: 1, label: 'connected' }, { value: 2, label: 'connecting' }, { value: 3, label: 'disconnecting' }, ]; // 定义连接日志Schema与模型,对应collection为connection_logs const connectionLogSchema = new mongoose.Schema({ connectTime: { type: Date, required: true, default: Date.now // 自动生成连接时间 } }); const ConnectionLog = mongoose.model('ConnectionLog', connectionLogSchema); // 监听连接成功事件 mongoose.connection.on('connected', async () => { try { // 写入本次连接记录 await ConnectionLog.create({}); // 统计累计连接次数 const totalCount = await ConnectionLog.countDocuments(); const state = Number(mongoose.connection.readyState); console.log(dbState.find(f => f.value === state).label, 'to db'); console.log(`本次连接时间:${new Date().toLocaleString()}`); console.log(`累计连接次数:${totalCount}`); } catch (err) { console.error('连接记录写入异常:', err); } }); // 初始化数据库连接,补充官方推荐的useUnifiedTopology配置消除警告 mongoose.connect('mongodb://localhost:27017/firstdatabase', { useNewUrlParser: true, useUnifiedTopology: true });
3. 性能优化实现(单文档原子计数)
如果不需要留存每一次的连接明细,只需要最后一次连接时间和累计次数,可以用单条文档原子更新的方式实现,性能更高,不会出现并发计数错误:
// 替换上面代码中的模型定义和事件监听逻辑即可 // 定义统计专用Schema,固定_id保证只有一条统计文档 const dbStatSchema = new mongoose.Schema({ _id: { type: String, default: 'connect_stat' }, totalConnectCount: { type: Number, default: 0 }, lastConnectTime: Date }); const DbStat = mongoose.model('DbStat', dbStatSchema); mongoose.connection.on('connected', async () => { try { // 原子更新:次数自增1,更新最后连接时间,文档不存在则自动创建 const stat = await DbStat.findByIdAndUpdate( 'connect_stat', { $inc: { totalConnectCount: 1 }, $set: { lastConnectTime: new Date() } }, { new: true, upsert: true } ); const state = Number(mongoose.connection.readyState); console.log(dbState.find(f => f.value === state).label, 'to db'); console.log(`本次连接时间:${stat.lastConnectTime.toLocaleString()}`); console.log(`累计连接次数:${stat.totalConnectCount}`); } catch (err) { console.error('连接统计更新异常:', err); } });
注意事项
- 不要把记录逻辑直接写在
mongoose.connect的回调函数中,该回调只会在首次连接时触发,无法覆盖断线重连的场景 - 所有数据库写入操作需要加异常捕获,避免统计逻辑出错影响主服务运行
- 新增的
useUnifiedTopology: true是Mongoose官方推荐的连接配置,用于解决旧版连接引擎的弃用警告
内容的提问来源于stack exchange,提问作者Rahele
相关产品推荐
相关产品推荐

