2013-01-04 36 views
2

使用貓鼬我在做什麼:貓鼬doc.save沒有錯誤失敗的架構方法

var postSchecma = mongoose.Schema({ 
title: String, 
body: String, 
link: String, 
voting: { 
    has: { 
     type: Boolean, 
    default: 
     false 
    }, 
    canVoteFor: [mongoose.Schema.Types.Mixed], 
    votedFor:{}, 
    voteDates:{} 
}, 
comments: [mongoose.Schema.Types.Mixed], 
date: { 
    type: mongoose.Schema.Types.Mixed, 
default: 
    new Date().getTime() 
} 
}, { 
    strict: false, 
    safe:true 
}) 

​​

在postSchecma.methods.vote this.voting.votedFor [voteFor的價值] 是正確的。但是當我查詢數據庫這是舊值。如果它幫助我在2個文件中使用數據庫,並且方法可能不完全重複。 我也知道這是貓鼬的事情,因爲我可以用mongoDB GUI將記錄更改爲不同的值,並且它工作正常。 讓我知道如果你需要任何更多的信息, 感謝, Porad說

回答

9

模式中的任何字段,其定義爲{}Mixed必須作爲修改或貓鼬將不知道它已經改變了和貓鼬被明確標記需要保存它。

在這種情況下,你需要將以下之前save補充:

this.markModified('voting.voteDates'); 
this.markModified('voting.votedFor'); 

查看Mixedhere文檔。

+0

You Sa ved我的生活! –

0

原來,這也有時適用於非Mixed項目,因爲我痛苦地發現。如果您重新分配整個子對象,那麼您還需要在那裏使用markModified。至少......有時。我沒有用來得到這個錯誤,然後我做了,沒有改變任何相關的代碼。我的猜測是這是一個貓鼬版本升級。

示例!假設你有...

personSchema = mongoose.Schema({ 
    name: { 
     first: String, 
     last: String 
    } 
}); 

...然後你叫......

Person.findById('whatever', function (err, person) { 
    person.name = {first: 'Malcolm', last: 'Ocean'}; 
    person.save(function (err2) { 
     // person.name will be as it was set, but this won't persist 
     // to the database 
    }); 
}); 

...你將有一個壞的時間,除非你save

(前稱person.markModified('name')或者可選地,撥打person.markModified('name.first')person.markModified('name.last') ......但這似乎在這裏顯然較差)