在阅读Mongoose's documentation时,我找到了findOneAndModify
的以下注释:
虽然使用时将值转换为适当的类型 findAndModify助手,未应用以下内容:
defaults setters validators middleware
文档接着解释说,为了获得这些,我们应该遵循使用traditional
和findOne
的{{1}}方法。
我的问题:为什么不应用这些功能?我知道这可能仅仅是Mongoose开发人员的设计决策,但是,查看save
和findOne
的代码,我看不出太多差异。
注意:这不一定是findOneAndUpdate
特有的,但适用于findOneAndUpdate
等其他方法。
答案 0 :(得分:4)
findOneAndUpdate
可让您使用MongoDB
与Mongoose
进行原始通话。它只发送findAndModify
request to MongoDB
。
setters
,validators
和middlewares
要求Mongoose
首先获取所有数据。
findOneAndUpdate
比传统方式更快,因为它只是一次调用MongoDB
跳过所有Mongoose
魔法。
Mongoose
findOneAndUpdate
函数与原始db.collection.findAndModify
操作之间唯一的实际区别是Mongoose
根据您的架构强制执行更新操作。
更新。 According to API docs issues a mongodb findAndModify update command
。
当您使用findOne
和save
的传统方式时,Mongoose
会抓取所有数据并将其包装到Mongoose document中。然后它会捕获应用getter的所有更新操作。然后,当您在文档上调用save
时,它将运行所有验证器和挂钩,并对已修改的字段发出原子更新操作。它不是用raw MongoDB
db.collection.save
这样的新文档替换旧文档。