我正在使用Node.js和MongoDB/Mongoose开发一个Web应用程序。我们最常用的模型是“记录”,它有许多子文档数组,例如“评论”、“预订”和“订阅者”。
在客户端应用程序中,每当用户点击“删除”按钮时,它就会向该特定评论的删除路由发出AJAX请求。我遇到的问题是,当许多这样的AJAX调用同时到达时,Mongoose会在某些(但不是所有)调用上失败并出现“找不到文档”的错误。
只有在快速且频繁地进行调用时才会出现这种情况。我认为这是由于Mongoose中的版本引起的文档冲突。我们当前的删除过程如下:
1. 使用
我找到了一种解决方案,可以手动更新集合,然后使用
使用Mongoose包装器并不能真正解决我的问题,因为它不允许我使用任何类型的中间件或钩子,而这实际上是使用Mongoose的巨大优势之一。
这是否意味着Mongoose在快速编辑方面基本无用,我最好使用原生的MongoDB驱动程序?我是否误解了Mongoose的限制?我该如何解决这个问题?
在客户端应用程序中,每当用户点击“删除”按钮时,它就会向该特定评论的删除路由发出AJAX请求。我遇到的问题是,当许多这样的AJAX调用同时到达时,Mongoose会在某些(但不是所有)调用上失败并出现“找不到文档”的错误。
只有在快速且频繁地进行调用时才会出现这种情况。我认为这是由于Mongoose中的版本引起的文档冲突。我们当前的删除过程如下:
1. 使用
Record.findById()
获取文档。
2. 从相应的数组中删除子文档(使用comment.remove()
)。
3. 调用record.save()
。我找到了一种解决方案,可以手动更新集合,然后使用
$pull
操作符。但是,这意味着我们不能使用mongoose的任何中间件,完全失去了版本控制。我越想越多,越意识到类似情况可能发生,我必须使用Mongoose的包装函数,例如findByIdAndUpdate
或findAndRemove
。我能想到的唯一解决方案是将删除尝试放入while
循环中并希望它有效,但这似乎是一个非常糟糕的修复方法。使用Mongoose包装器并不能真正解决我的问题,因为它不允许我使用任何类型的中间件或钩子,而这实际上是使用Mongoose的巨大优势之一。
这是否意味着Mongoose在快速编辑方面基本无用,我最好使用原生的MongoDB驱动程序?我是否误解了Mongoose的限制?我该如何解决这个问题?