现象

相册照片从 130 张变成了 23 张。8 月初没有部署额度,本地预览时发现相册只剩 23 张,其余 107 张”消失”了。第一反应是数据丢了。

排查:三次误判

  1. 先查 git:照片文件和元数据都在 .gitignore 里,根本不是提交问题。
  2. 以为本地 .env 没配 MongoDB 和 R2,数据落到了本地磁盘 + JSON。
  3. 以为连错了库。真相是:数据一直在 lublog 库的 gallery_images 集合,130 条元数据一条没少,丢的是 107 张图片文件(没上传到 R2)。

根因:全量覆盖写

同步代码的思路是:把内存里的相册数据当成”完整真相”,先把库里”不在这份数据里”的记录全删掉($nin),再整份写回去。

问题出在本地环境读到的是残缺的本地 JSON,内存里的快照不是完整真相。于是库里 107 条真实记录被当成”多余的”删了。

一句话:用残缺的快照,覆盖了完整的数据。

修复

改成增量更新:要删的 id 显式列出来精确删($in),其余只做插入或更新,不做无差别的全量覆盖。

教训

  1. 全量删除类代码($nin、truncate、drop)默认危险,看到就警觉。
  2. 数据边界(谁写、从哪读、快照是否完整)必须自己 review,AI 不会想”快照可能残缺”。
  3. 先确认数据到底在哪(库、集合、对象存储、本地文件),再动手恢复,别按”我以为”推断。
  4. 写库前先备份或保证可回滚,覆盖写要有后悔药。