Mongoose删除已检索文档的实例方法及与findByIdAndRemove性能差异
解答
实例级删除方法说明
Mongoose的文档实例确实提供了直接删除当前文档的方法,不需要在拿到查询结果后再回模型层调用静态删除方法。
目前官方推荐使用的实例删除方法是deleteOne(),你预期的写法完全可以正常运行:
// Account 为定义好的数据模型 const foundAccount = await Account.findById(userId); // 对查询到的账号实例做自定义业务处理 await foundAccount.deleteOne();
注意:旧版本Mongoose曾提供实例级的remove()方法,该方法在Mongoose 7.x及以上版本已被标记废弃,不建议在新项目中使用。
两种删除方式的性能差异
两种写法的性能差异需要结合使用场景判断,没有绝对的优劣:
- 如果你已经提前将文档查询到内存中完成了业务处理:两种方式性能几乎无差别。两者底层都是向MongoDB发送一条以
_id为筛选条件的单文档删除指令,数据库侧的执行逻辑完全一致,仅有的参数传递层面的细微内存开销可以忽略不计。 - 如果你不需要提前获取文档内容做处理:直接调用静态方法
findByIdAndRemove()性能更优。这种写法只需要和数据库完成一次网络交互即可完成删除,不需要先发起查询请求拿到文档、再发起删除请求,少了一次数据库往返的开销。
额外提醒:两种方式触发的Mongoose中间件逻辑不同。实例调用deleteOne()会触发Schema上配置的文档级deleteOne钩子,而静态方法findByIdAndRemove()本质是findOneAndDelete的语法糖,触发的是查询级别的中间件,如果业务中配置了删除相关的钩子逻辑,需要注意这个差异避免逻辑不生效。
内容的提问来源于stack exchange,提问作者Caliph Hamid
相关产品推荐
相关产品推荐

