You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

每次连接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:15:44