2015-10-09 71 views
1

我有一個默認生成值的模型,在整個文檔生命週期中不會更改,除非在特殊情況下。Mongoose.js:屬性默認值isModified標誌

的文件可能會被標記爲使用doc.update({_id: doc._id, deleted_at: new Date()}, {overwrite: true})

刪除在一個非常特殊的情況下,可以將文檔「起死回生」 - 擡頭通過它的id和之後再次與正在工作。

在預保存鉤子中,每當創建或恢復文檔時,我都需要執行一些操作(例如將文檔存儲在另一個集合中)。

考慮以下簡化代碼:

'use strict'; 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 
var someSchema = mongoose.Schema({ 
     immutable: { 
      type: String, 
      default: function() { 
       return 'SomeVeryRandomValue'; 
      } 
     } 
    }); 

someSchema.pre('save', function (next) { 
    if (this.isNew || this.isModified('immutable')) { 
     console.log('Processing pre-save hook!'); 
    } 
    next(); 
}); 

var SomeModel = mongoose.model('SomeModel', someSchema, 'test'); 

mongoose.connection.once('open', function (err) { 
    var testDoc = new SomeModel({}); 
    console.log('New: %j', testDoc.toObject()); 

    testDoc.save(function(err) { 
     console.log('Initial saved: %j', testDoc.toObject()); 

     testDoc.update({_id: testDoc._id}, {overwrite: true}, function (err) { 

      // at this point using mongo console: 
      // > db.test.findOne() 
      // { "_id" : ObjectId("5617b028bf84f0a93687cf67") } 

      SomeModel.findById(testDoc.id, function(err, reloadedDoc) { 
       console.log('Reloaded: %j', reloadedDoc.toObject()); 
       console.log('reloaded isModified(\'immutable\'): %j', reloadedDoc.isModified('immutable')); 

       reloadedDoc.save(function(err) { 
        console.log('Re-saved: %j', reloadedDoc); 
        mongoose.connection.close(); 
       }); 
      }); 

     }); 
    }); 
}); 

和腳本運行時輸出:

$ node mongoose-modified-test.js 
New: {"_id":"5617b64c5376737b46f6bb98","immutable":"SomeVeryRandomValue"} 
Processing pre-save hook! 
Initial saved: {"__v":0,"_id":"5617b64c5376737b46f6bb98","immutable":"SomeVeryRandomValue"} 
Reloaded: {"_id":"5617b64c5376737b46f6bb98","immutable":"SomeVeryRandomValue"} 
reloaded isModified('immutable'): false 
Re-saved: {"_id":"5617b64c5376737b46f6bb98","immutable":"SomeVeryRandomValue"} 

immutable改性沒有標記恕我直言應該 - 原始文件有該屬性沒有價值。

一個變通的解決辦法是刪除默認值immutable屬性,並確定預驗證掛機像這樣的:

someSchema.pre('validate', function (next) { 
    if (this.isNew || !this.immutable) { 
     this.immutable = 'SomeVeryRandomValue'; 
    } 
    next(); 
}); 

這不是我所需要的東西,因爲該值將不會產生直到我嘗試驗證/保存文檔。前/後掛鉤不會在new SomeModel({})上執行,所以我不能使用這些掛鉤。

我應該爲mongoose.js開一個問題嗎?

+0

https://github.com/Automattic/mongoose/issues/3480 – geronime

回答

1

this.$isDefault('immutable')可以用來代替。腳本的

someSchema.pre('save', function (next) { 
    if (this.isNew || this.$isDefault('immutable')) { 
     console.log('Processing pre-save hook!'); 
    } 
    next(); 
}); 

輸出與更新預存鉤:

$ node --harmony mongoose-modified-test.js 
New: {"_id":"56276f0c1a2f17ae7e0a03f7","immutable":"SomeVeryRandomValue"} 
Processing pre-save hook! 
Initial saved: {"__v":0,"_id":"56276f0c1a2f17ae7e0a03f7","immutable":"SomeVeryRandomValue"} 
Reloaded: {"_id":"56276f0c1a2f17ae7e0a03f7","immutable":"SomeVeryRandomValue"} 
Processing pre-save hook! 
Re-saved: {"_id":"56276f0c1a2f17ae7e0a03f7","immutable":"SomeVeryRandomValue"} 

感謝@ vkarpov15爲clarification