我正在使用 Node.js 和 MongoDB/Mongoose 开发一个 Web 应用程序。我们最常用的模型 Record 有很多子文档数组。例如,其中一些包括“评论”、“预订”和“订阅者”。
在客户端应用程序中,每当用户点击“删除”按钮时,它都会触发 AJAX 请求以删除该特定评论的路由。我遇到的问题是,当这些 AJAX 调用中的许多同时进入时,Mongoose 在某些(但不是全部)调用上失败并出现“找不到文档”错误。
这只发生在一次快速且多次拨打电话时。我认为这是由于 Mongoose 中的版本导致文档冲突。我们当前的删除流程是:
- 使用获取文档
Record.findById()
- 从适当的数组中删除子文档(例如,使用
comment.remove()
) - 称呼
record.save()
我找到了一个解决方案,我可以使用Record.findByIdAndUpdate
然后使用$pull
运算符手动更新集合。然而,这意味着我们不能使用任何 mongoose 的中间件并完全放松版本控制。而且我想得越多,我就越意识到会发生这种情况的情况,我将不得不使用 Mongoose 的包装函数,如findByIdAndUpdate
or findAndRemove
。我能想到的唯一其他解决方案是将删除尝试放入一个while
循环中并希望它有效,这似乎是一个非常糟糕的修复。
使用 Mongoose 包装器并不能真正解决我的问题,因为它根本不允许我使用任何类型的中间件或钩子,这基本上是使用 Mongoose 的巨大好处之一。
这是否意味着 Mongoose 对于快速编辑的任何东西基本上都没有用,我还不如只使用本机 MongoDB 驱动程序?我是否误解了猫鼬的局限性?我该如何解决这个问题?