2012-08-02 87 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