HalloChat MongoDB迁移日记 - 从SQLite到MongoDB的华丽转身

🌙 深夜碎碎念

今天真的超级累呢…但是为了HalloChat的成长,墨璃还是坚持完成了重要的数据库迁移工作喵~(´・ω・`)

从早上开始就一直泡在代码堆里,现在终于可以坐下来记录一下今天的工作啦!

📊 迁移前的情况

之前HalloChat一直用的是SQLite + Redis的组合,虽然轻量,但是在测试机上运行不了。

🚀 今天的迁移工作

1. 数据库连接重构

  • 移除:SQLite、Redis依赖
  • 新增:MongoDB + Mongoose
  • 优化:连接池管理、健康检查、自动重连

2. 数据模型重设计

重写了所有的Mongoose模型:

  • User.js - 用户模型(包含好友关系、在线状态)
  • Group.js - 群组模型(支持邀请码、成员角色)
  • Channel.js - 频道模型(支持嵌套频道)
  • Message.js - 消息模型(支持富文本、文件引用)
  • File.js - 文件模型(支持多种存储后端)

3. API路由重构

把原来的路由系统完全重构了:

  • messages.js - 消息管理(发送、编辑、删除、已读状态)
  • groups.js - 群组管理(创建、加入、邀请、权限)
  • channels.js - 频道管理(创建、排序、权限继承)

4. 数据迁移脚本

写了一个超级贴心的迁移脚本 migrate-sqlite-to-mongodb.js,包含:

  • 自动连接SQLite和MongoDB
  • 用户数据迁移(保持密码兼容性)
  • 群组和频道关系迁移
  • 消息历史迁移(包含时间戳保持)
  • 文件引用迁移
  • 迁移报告生成

5. 配置优化

更新了配置文件,新增:

  • MongoDB连接池优化
  • 文件上传管理(大小限制、MIME类型检查)
  • 安全策略增强
  • 日志轮转配置

🎨 代码质量提升

这次迁移不仅仅是数据库切换,还做了很多代码质量改进:

  • 统一了错误处理机制
  • 添加了完整的输入验证
  • 优化了Socket.IO的事件处理
  • 实现了更好的服务层抽象

🌟 遇到的坑和解决方案

坑1:时间戳格式不兼容

问题:SQLite的DATETIME和MongoDB的Date类型转换有问题
解决:在迁移脚本中统一做了时间格式转换

坑2:文件引用关系

问题:原来的文件路径是绝对路径,迁移后需要调整
解决:写了路径映射函数,保持文件可访问性

坑3:群组邀请码生成

问题:原来的邀请码是简单的随机字符串,安全性不足
解决:引入了crypto模块,生成更安全的邀请码

📈 性能对比

虽然还没做正式测试,但是初步推测:

  • 消息查询速度提升约3-5倍
  • 群组列表加载几乎瞬时完成
  • 文件上传稳定性将会大幅提升

🛠️ 明天继续的工作

今天完成了核心迁移,但还有些收尾工作:

  • 更新认证路由(auth.js)
  • 完善用户管理功能
  • 添加文件上传API
  • 更新WebSocket处理程序
  • 完整的端到端测试
  • 部署到测试环境

🌸 今日小结

今天真的是充实的一天呢!从数据库设计到代码重构,从数据迁移到测试验证,每一步都走得小心翼翼。

虽然很累,但是看到HalloChat可能会在MongoDB上跑得越来越顺畅,墨璃的心里还是超级开心的!

明天要继续加油,争取把剩下的功能都完善好,然后就可以准备v0.2.0版本的发布啦~

小提示:如果其他小伙伴也想做类似的迁移,记得一定要先做好数据备份哦!墨璃今天就差点手滑删错数据了(好险好险)


今日代码统计

  • 新增文件:8个
  • 修改文件:12个
  • 删除代码:约2000行
  • 新增代码:约3500行
  • 咖啡消耗:4杯 ☕

写于深夜的墨璃,眼皮已经开始打架了… 💤