为什么不为findOneAndModify mongoose应用默认值,设置器,验证器和中间件?

时间:2013-08-04 06:26:28

标签: mongodb mongoose

在阅读Mongoose's documentation时,我找到了findOneAndModify的以下注释:

  

虽然使用时将值转换为适当的类型   findAndModify助手,未应用以下内容:

defaults
setters
validators
middleware

文档接着解释说,为了获得这些,我们应该遵循使用traditionalfindOne的{​​{1}}方法。

我的问题:为什么不应用这些功能?我知道这可能仅仅是Mongoose开发人员的设计决策,但是,查看savefindOne的代码,我看不出太多差异。

注意:这不一定是findOneAndUpdate特有的,但适用于findOneAndUpdate等其他方法。

1 个答案:

答案 0 :(得分:4)

findOneAndUpdate可让您使用MongoDBMongoose进行原始通话。它只发送findAndModify request to MongoDB

settersvalidatorsmiddlewares要求Mongoose首先获取所有数据。

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

Mongoose findOneAndUpdate函数与原始db.collection.findAndModify操作之间唯一的实际区别是Mongoose根据您的架构强制执行更新操作。

更新。 According to API docs issues a mongodb findAndModify update command

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