Automattic / Automattic/mongoose

Support modifying document while `save()` is in progress

Open
#10,011 1 comment 0 reactions 1 assignee Claimed by @vkarpov15 View on GitHub
enhancement
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.