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'操作。 –