mongodb - 如何判断 document.save 是否在猫鼬中进行?
问题描述
我正在寻找一种方法来检查文档是否已经保存,try {document.save()} catch (e) {if (e.name == 'ParallelSaveError') {...}}
但是一些快速的谷歌搜索没有找到这样的东西。
(猫鼬版本 5.7.3,fwiw)
上下文,因为我觉得我可能面临XY 问题的风险:
从不同端点更新同一个对象时,我想避免ParallelSaveError
,并且由于各种原因,我正在使用缓存对象。我正在考虑编写一个saveDebounce
基本上执行以下操作的函数:
- 如果已经保存,等到保存后再保存
- 等待 X 毫秒,然后保存
- (除非同时调用 saveDebounce,在这种情况下重置计时器)
我完全疯了吗?一个更明智的解决方案是否会涉及不以这种方式使用缓存,或者使用Model.update(...)
而不是document.save()
?
(就其价值而言,Model.update
在这里使用起来有点困难,因为我不仅要覆盖数据,而且还需要合并它,但我想我可以获取精益,创建合并版本,然后更新 db 中的对象,然后使用该更新版本刷新缓存...)
解决方案
好的,这就是我所经历的。更短的去抖时间似乎太快了。我不是在任何地方都使用它,而是在可能与其他东西并行调用的主要地方,例如与前端操作相关联的端点,这些操作通常PUT
基本上同时导致多个请求。
似乎工作得很好,让我可以使用我所有的原始pre validate
和pre save
钩子。如果结果是一场灾难,我会更新这篇文章
UserSchema.methods.saveWithRetriesForParallelism = async function () {
if (arguments.length) {throw new Error("Warning: saveWithRetriesForParallelism doesn't support callbacks")}
const user = this
const nRetries = 5
let debounceTime = 100
try {
return await user.save()
} catch (err) {
if (err.name !== 'ParallelSaveError') {
throw err
}
for (var i = 0; i < nRetries; i++) {
console.log("ParallelSaveError - retry in " + debounceTime)
await cu.waitNmillis(debounceTime)
try {
return await user.save()
} catch (err2) {
if (err.name !== 'ParallelSaveError') {
throw err2
}
debounceTime*=2
}
}
throw err
}
}
推荐阅读
- css - CSS网格fr单位
- azure-application-insights - C#-在哪里使用带有 azure 函数应用程序的 log4net 设置?
- java - 如何在 AOSP 中的应用程序中使用 rebootWipeUserData()?
- python - BeautifulSoup:查找类名:AND + NOT
- azure-application-insights - Application Insights - 无法查看 SQL 查询
- android - 导航架构组件 - 启动画面
- svg - 在 Scala.js 中,修改 svg.Stylable.style
- apache - 是否可以将子目录指向另一个 AWS 实例?
- java - Jersey 端点在 Eclipse 上返回 404
- amazon-web-services - aws cli s3 存储桶下载命令错误