Automattic / Automattic/mongoose
Support modifying document while `save()` is in progress
- Dominant language
- JavaScript
- Stars
- 27.5k
- Forks
- 4k
- Avg merge
- 2d 7h
- Merged PRs (30d)
- 35
Description
工作中发现,该框架针对增量存盘的支持有点不足:
文件路径: node_modules/mongoose/lib/model.js
框架实现流程:
mongoose 的 model.save 调用以下代码提取增量数据进行存盘:const delta = this.$__delta();
存盘回调中,调用以下代码清理脏标记:this.$__reset();
问题:
存盘提取了Modified数据后,若在后续的的异步过程中文档被修改,则相关修改会被重置掉,导致此部分修改丢失
修改方法:
1、在提取了增量数据后,马上就清理脏标记
// 存盘成功前先调用 __reset, callback时就不 __reset, 避免存盘过程又有异步修改,导致后续修改不能存盘的问题
this.$__reset();
2、在存盘的回调中,注释掉 reset
// 存盘成功前先调用 __reset, callback时就不 __reset, 避免存盘过程又有异步修改,导致后续修改不能存盘的问题
// this.$__reset();
不足之处:
存盘完成的回调提取不到 modifiedPaths 了,存盘失败的话,修改也会丢失
改进方向:
reset 前先提取 modifiedPaths 缓存,存盘失败的话,从上述缓存重置 modifiedPaths
// 保存文档重置前修改的路径
const modifiedPaths = this.modifiedPaths();
// this.$__reset();
至此,框架针对增量存盘的支持满足在异步情况下的增量存盘。
Contributor guide
Assessment
This issue has not been assessed yet.