保存Mongoose嵌套模式

我有一个问题,保存嵌套的subdocs – 不知道是否因为它不是一个数组或什么 – 文档似乎表明,嵌套的对象是自动保存,但他们不是在这种情况下。

一个小孩模式:

var Address = new Schema({ phone: String, name: String, street: { type: String, required: true } }); 

主要模式:

 var Order = new Schema({ code: { type: String }, address: { type: Schema.Types.ObjectId, ref: "Address" } }); 

这些都不会起作用。

创build文档不会抛出错误,但不保存subdoc

 var a = new Address({ phone: 000 }); var o = new Order({ address: a }).save(); 

这给了一个Cast到ObjectId失败的错误:

 var o = new Order({ address: { phone: 000 } }).save(); 

这似乎工作的唯一方法是通过首先保存subdocs我想避免,因为我有多个地址,所以有点混乱。

奇怪的是,我从来没有遇到过这个问题 – 任何想法?

好。 显然,我们不能使用没有数组的子目录。 请参阅SOpost无embedded式文档的数组? 和错误线程解释推理: https : //github.com/LearnBoost/mongoose/pull/585

主模式中的地址对象应该是Schema.Types.Mixedtypes。 你指定的地址应该是一个ObjectId,这就是为什么你得到Cast到ObjectId错误。

请参阅http://mongoosejs.com/docs/schematypes.html

例:

 var Order = new Schema({ code: { type: String }, address: { type: Schema.Types.Mixed, ref: "Address" } }); 

好。 如果您只需要一个带有子字段的字段,则不需要其他模式,您可以这样做:

 var Order = new Schema({ code: { type: String }, address: { phone: String, name: String, street: { type: String, required: true } } }); 

为了保存地址模式,你需要在你的函数中保存命令:var Address = mongoose.model('Address'); var Order = mongoose.model('Order');

 export.createAddress = function( req, res) { var address = new Address({phone: 000}); address.save(callback function); }; 

对于Order模式,您所需要做的是:

 export.createOrder = function( req, res){ var order = new Order(req.body); order.address = req.address; order.save(callback function); }; 

请注意这是一个使用节点的例子,express