2015-02-24 53 views
0

裏面一個MEAN.js的應用程序,我有一個具有subdoc的參考架構:設置在一個未定義/ null的子文檔ObjectID字段的值會產生鑄造到的ObjectId錯誤

var EmployeeSchema = new Schema({ 
    supervisor: { 
     type: Schema.Types.ObjectId, 
     ref: 'User', 
    }, 
    ... 

我能使用或不使用監督員字段,從模式創建模型。如果該值設置爲創建,那麼我就能來取消它,像這樣:

employee.supervisor = undefined; 

employee.save(function(err) { 
... 

然而,如果該字段值是不確定的已經,那麼我就無法在其後設置的任何值 - 這將產生以下錯誤:

CastError: Cast to ObjectId failed for value "[object Object]" at path "supervisor" 

事實上,在試圖再次將該值設置爲不確定的,具有相同的.save代碼路徑,會導致同樣的錯誤。這個錯誤來自哪裏?它指的是什麼(當我發送一個未定義的值)?

我對貓鼬比較新。這感覺像是一個基本問題,並且很可能是用戶錯誤。如果我沒有使用正確的模式,請告訴我。我正在使用貓鼬3.8.8,我轉移到3.8.23,無濟於事。

編輯:一些可能很重要的事情是,當員工返回給客戶時,主管人員已經填充。使用MEAN boilerplate express控制器進行更新似乎存在一個問題,即執行將已更改狀態的_.assign發送給發送給客戶端的req.employee數據。

如果我再次手動查詢員工,並設置/取消設置主管字段,那麼我可以在沒有錯誤的情況下獲得預期的行爲。這包括設置爲未定義,並設置回有效值。因此,它歸結爲人口+使用請求數據執行更新的組合。

回答

0

我認爲這是因爲未定義的Schema.Types.ObjectId驗證失敗。你應該在

Employee.update({ 
    //whatever query 
}, 
{ 
    $unset: { supervisor: true } 
}, 
{ multi: true}) 
+0

使用$取消設置爲按[鏈接](http://stackoverflow.com/questions/4486926/delete-a-key-from-a-mongodb-document-using-mongoose)未定義+保存等同於更新+未設置。這不是這種情況嗎? – 2015-02-25 01:43:32