2013-07-30 73 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'操作。 –