现象
相册照片从 130 张变成了 23 张。8 月初没有部署额度,本地预览时发现相册只剩 23 张,其余 107 张”消失”了。第一反应是数据丢了。
排查:三次误判
- 先查 git:照片文件和元数据都在
.gitignore里,根本不是提交问题。 - 以为本地
.env没配 MongoDB 和 R2,数据落到了本地磁盘 + JSON。 - 以为连错了库。真相是:数据一直在
lublog库的gallery_images集合,130 条元数据一条没少,丢的是 107 张图片文件(没上传到 R2)。
根因:全量覆盖写
同步代码的思路是:把内存里的相册数据当成”完整真相”,先把库里”不在这份数据里”的记录全删掉($nin),再整份写回去。
问题出在本地环境读到的是残缺的本地 JSON,内存里的快照不是完整真相。于是库里 107 条真实记录被当成”多余的”删了。
一句话:用残缺的快照,覆盖了完整的数据。
修复
改成增量更新:要删的 id 显式列出来精确删($in),其余只做插入或更新,不做无差别的全量覆盖。
教训
- 全量删除类代码(
$nin、truncate、drop)默认危险,看到就警觉。 - 数据边界(谁写、从哪读、快照是否完整)必须自己 review,AI 不会想”快照可能残缺”。
- 先确认数据到底在哪(库、集合、对象存储、本地文件),再动手恢复,别按”我以为”推断。
- 写库前先备份或保证可回滚,覆盖写要有后悔药。
游客评论无需登录,昵称和邮箱为选填项(邮箱仅用于回复通知)。什么是 Waline?