2012-08-02 103 views
2

我想要做的是定義一個名爲「調度」的字段,其中包含一個調度實例數組的字段,但我不希望調度模型能夠保存到它自己的集合。有沒有辦法在沒有.save()方法的貓鼬中定義模型?

下面是一些代碼,它會更有意義:

var ScheduleSchema = new Schema({ 
    day: {type: Number, min: 0, max: 6}, 
    time: {type: Number, min: 0, max:24} 
}); 

var StudentSchema = new Schema({ 
    firstName: String, 
    schedule: [ScheduleSchema] 
}); 

var Schedule = mongoose.model("Schedule", ScheduleSchema); 
var Student = mongoose.model(modelName, StudentSchema); 
Student.Schedule = Schedule; 

我與該位的代碼具有的問題是,當我這樣做:

var schedule = new Student.Schedule({day: 3, time: 15}); 

我會得到什麼像這樣,當我console.log

{ "day" : 3, "time" : 15, "_id" : ObjectId("5019f34924ee03e20900001a") } 

我得到了_id的自動生成,通過明確定義架構_id ,

var ScheduleSchema = new Schema({ 
    _id: ObjectIdSchema, 
    day: {type: Number, min: 0, max: 6}, 
    time: {type: Number, min: 0, max:24} 
}); 

現在它只是給了我:

{ "day" : 3, "time" : 15} 

這可能是個hack..and不是我想要依靠。

的另一個問題是,如果我

schedule.save() 

它實際上將創建一個收集和文檔保存到數據庫中。

是否有一種方法來禁用調度save()?有沒有一個正確的方法來做到這一點?

我大概可以堅持與我有什麼,或滿足於混合類型,但失去了驗證..

回答

0

爲什麼你會做schedule.save()呢?您應該保存父對象(即Student對象),而不是嵌入的文檔。如果您保存schedule則默認會追加_id。如果您將Student對象與schedule保存爲嵌入式文檔,則不會發生這種情況。

人們也爲您Schedule模型禁用.save方法(這是一個有趣的功能,可以讓你有Schedule模型作爲嵌入文檔的模型,並在同一時間獨立的文檔模型)沒有真正的理由。只是不要使用它。做這樣的事情:

var student = new Student({ firstName: 'John' }); 
var schedule = new Schedule({ day: 3, time: 15 }); 
student.schedules.push(schedule); 
student.save(); 
+0

當然,我不會做schedule.save(),因爲我寫了這個。我只是不希望模糊的代碼能夠做它不應該做的事情。你也提到'_id'不會生成,如果我確實保存在學生身上,但唯一能夠得到這種行爲的方式是添加'_id'hack我在ScheduleSchema中做了..除非這不是黑客,我在他們的文檔中的任何地方都找不到它。 – Khon 2012-08-02 14:00:55

+0

真的嗎?目前我無法測試,但我會在幾個小時內回覆您。 – freakish 2012-08-02 14:02:22

+0

是的,我寫了摩卡測試。我只通過添加_id:ObjectIdSchema將測試傳遞給ScheduleSchema。我使用貓鼬2.7.0順便說一句。 – Khon 2012-08-02 14:31:31

相關問題