1
我创造了一些schema.pre('save', function(){...});
验证,但后来了解到更新没有触发它。我真的想要验证更新,所以我开始这样做:Mongoosejs集/保存与更新验证
MySchema.findOne({...}, function(doc) {
doc.set(req.body);
doc.save(function(){...});
});
这样做有什么缺点吗?它似乎逻辑,但我还没有看到做了很多次,因为我已经看到他们doc.update({});
或MySchema.findXxxAndUpdate({},{})
做这样的更新。我知道update
只是将所有内容传递给本机驱动程序,因此set/save会导致一些性能损失?原子性如何?
Mongoose用原子'update'操作包装每个'save'操作。它还具有内置版本支持以防止文档被覆盖。 –
@LeonidBeschastny基于[这个文档(http://aaronheckmann.tumblr.com/post/48943525537/mongoose-v3-part-1-versioning)更新嵌入式阵列的属性,当版本仅使用,但它不是很记录那么你可能是对的,它不止于此。无论如何,你仍然需要添加代码来处理可能会混乱的失败保存案例。 – JohnnyHK
正如你的链接所暗示的,猫鼬版本保护所有可能改变元素绝对位置的数组操作。所有其他更新操作应与'save'和'findOneAndUpdate'相同,除了getter,validators和hooks,因为'mongoose'较新的调用mongoidb'save'方法。从db中获取整个文档,更新单个字段并保存它将导致在这个字段上单独进行原子'update'操作。 –