1

在阅读Mongoose 的文档时,我发现了以下注释findOneAndModify

尽管在使用 findAndModify 帮助器时将值转换为适当的类型,但以下内容不适用:

defaults
setters
validators
middleware

文档继续解释说,为了获得这些,应该遵循traditional使用findOneand的方法save

我的问题:为什么不应用这些功能?我知道这可能只是 Mongoose 开发人员的设计决定,但是,查看findOneand的代码findOneAndUpdate,我看不出有多大区别。

注意:这不一定特定于findOneAndUpdate,但适用于其他方法,例如findOneAndRemove.

4

1 回答 1

4

findOneAndUpdate允许您对MongoDBwith进行原始调用Mongoose。它只是findAndModifyMongoDB.

settersvalidators并且middlewares需要Mongoose先获取所有数据。

findOneAndUpdate比传统方式更快,因为它只需一次调用即可MongoDB跳过所有Mongoose魔术。

Mongoose findOneAndUpdate函数和原始db.collection.findAndModify操作之间的唯一实际区别是Mongoose根据您的模式转换您的更新操作。

更新。 根据 APIissues a mongodb findAndModify update command文档。

当您使用 and 的传统方式时findOnesave获取Mongoose所有数据并将其包装到Mongoose 文档中。然后它会捕获所有应用 getter 的更新操作。然后,当您调用save文档时,它会运行所有验证器和挂钩,并对修改的字段发出原子更新操作。它不会像rawMongoDB db.collection.save那样用新文档替换旧文档。

于 2013-08-04T11:42:21.843 回答