2013-07-30 108 views
1

我创造了一些schema.pre('save', function(){...});验证,但后来了解到更新没有触发它。我真的想要验证更新,所以我开始这样做:Mongoosejs集/保存与更新验证

MySchema.findOne({...}, function(doc) { 
    doc.set(req.body); 
    doc.save(function(){...}); 
}); 

这样做有什么缺点吗?它似乎逻辑,但我还没有看到做了很多次,因为我已经看到他们doc.update({});MySchema.findXxxAndUpdate({},{})做这样的更新。我知道update只是将所有内容传递给本机驱动程序,因此set/save会导致一些性能损失?原子性如何?

回答

1

您的方法的主要缺点是您失去了更新的原子性,因为您的findOne调用和doc.save调用之间可能会发生另一次更新。

你也失去了各种更新运营商如$addToSet是提供测试,否则你将有代码来实现逻辑的力量。

+0

Mongoose用原子'update'操作包装每个'save'操作。它还具有内置版本支持以防止文档被覆盖。 –

+0

@LeonidBeschastny基于[这个文档(http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning)更新嵌入式阵列的属性,当版本仅使用,但它不是很记录那么你可能是对的,它不止于此。无论如何,你仍然需要添加代码来处理可能会混乱的失败保存案例。 – JohnnyHK

+0

正如你的链接所暗示的,猫鼬版本保护所有可能改变元素绝对位置的数组操作。所有其他更新操作应与'save'和'findOneAndUpdate'相同,除了getter,validators和hooks,因为'mongoose'较新的调用mongoidb'save'方法。从db中获取整个文档,更新单个字段并保存它将导致在这个字段上单独进行原子'update'操作。 –