2014-04-03 125 views
1

我正試圖使用​​貓鼬在mongo數據庫中的某些文檔中保留所有修訂的跟蹤。出於這個原因,我決定使用插件貓鼬版本。使用貓鼬和貓鼬版本更新條目時的新版本

當我創建一個新文檔並將其添加到數據庫時,我可以看到版本保存在存儲不同版本的集合中。但是,當我使用新文檔更新文檔時,可以看到在存儲文檔的集合(最新版本)中進行的更改,而不是存儲在版本化數據庫中的新版本。任何線索爲什麼這可能會發生?

這是我的架構:

var userSchema = new mongoose.Schema({ 
    name  : String, 
    username : { 'type': String, 'unique': true }, 
    email  : { 'type': String, 'unique': true }, 
    createdOn : { 'type': Date, 'default': Date.now }, 
    modifiedOn: { 'type': Date, 'default': Date.now } 
}); 

mongoose.model('User', userSchema, 'users'); 

// Versioning options 
var userVersioningOptions = { 
    collection: 'versionedUsers', 
    logError: true, 
    suppressVersionIncrement: true,  // default value 
    strategy: 'array', 
    removeVersions: false    // default value 
}; 

userSchema.plugin(version, userVersioningOptions); 

這是我如何創建用戶:

User.create({ 
    name  : request.body.FullName, 
    username : request.body.UserName, 
    email  : request.body.Email, 
    modifiedOn: Date.now() 
}, function (err, user) { 
    if (err) { 
     console.log(err); 
     if (err.code === 11000) { 
      response.redirect('/users/new?exists=true'); 
     } 
     else { 
      response.send("Error while creating new user. The error code was " + err.code + " and the entire error " + err); 
      //response.redirect('users/new?error=true'); 
     } 
    } 
    else { 
     console.log("User created and saved: " + user); 
     response.redirect('/users/' + user.username); 
    } 
}); 

這就是我如何更新用戶的詳細信息(基本上只有名稱可以改變,但是我正在學習時用於演示目的)。

User.update(
    {username: newDetails.username}, 
    {$set: {name: newDetails.name, modifiedOn: Date.now()}}, 
    {upsert: false, multi: true}, 
    function (err, numAffected) { 
     if (err) 
      throw err; 
     console.log("The error was " + err); 
     console.log("Updated " + numAffected + " documents"); 
     response.send({}, 200); 
    } 
); 

任何幫助或提示將非常感謝,因爲我也是一個新手在使用芒果和貓鼬以及。

+0

運氣與這一個嗎? –

+0

是的。我在開始時按照自己的意願做了自己的版本控制。首先,我在我想要版本的集合的文檔中添加了一個屬性'_revision'。然後在我的代碼中,每次我想爲db寫一個新版本時,我都會將這個值加1。然後,基本上我克隆了repo,並且我在''collection.js'文件(大約4-5行代碼)上稍微修改/添加了代碼。訣竅是創建一個克隆模式,以便對象id是隨機的(默認),並通過'_revision'屬性引用相應的版本。 – MightyMouse

+0

因此,克隆的模式幾乎是字面上是我保存的文檔的最新版本的副本。因此,我沒有真正的問題,我不得不小心或照顧,因爲我沒有修改內容,我只是複製。我也在這裏提出了修改建議:https://github.com/saintedlama/mongoose-version/issues/9 – MightyMouse

回答

0

截至目前,貓鼬版本不提供對更新(https://github.com/saintedlama/mongoose-version/issues/25)的支持。原因是因爲貓鼬的保存vs更新的性質(沒有掛鉤)。我相信貓鼬現在有更新的鉤子,但貓鼬版本尚未更新。

另一種可能的選擇是保存所有的oplog。取決於你的使用案例,但這可能是最容易設置/維護的,並且缺少更改的邊緣案例應該少得多。

我不能讚揚這個建議。這是從:http://www.askasya.com/post/bestversion/