Javascript 保存Mongoose嵌套模式

Javascript 保存Mongoose嵌套模式,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我在保存嵌套子文档时遇到了一个问题-不确定是不是因为它不是数组还是什么-文档似乎建议自动保存嵌套对象,但在本例中不是这样 子架构: var Address = new Schema({ phone: String, name: String, street: { type: String, required: true } }); 主模式: var Order = new Schema({ code: { type: String }, address: {

我在保存嵌套子文档时遇到了一个问题-不确定是不是因为它不是数组还是什么-文档似乎建议自动保存嵌套对象,但在本例中不是这样

子架构:

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"
  }
});
这两种方法都行不通

创建文档不会抛出错误,但不会保存子文档

var a = new Address({ phone: 000 });

var o = new Order({ address: a }).save();
这将导致对ObjectId的强制转换失败错误:

var o = new Order({ address: { phone: 000 } }).save();
唯一可行的方法是首先保存子文档,我希望避免这样做,因为我有多个地址,所以有点乱


奇怪的是,我从未遇到过这个问题-有什么想法吗?

好的。显然,我们不能使用没有数组的子文档。请参阅解释推理的SO post和bug线程:

主架构中的地址对象应为schema.Types.Mixed类型。您指定的地址应该是ObjectId,这就是为什么您将转换为ObjectId错误的原因

例如:

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.createOrder =  function( req, res){
   var order = new Order(req.body);
    order.address = req.address;
    order.save(callback function);
}; 

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

的示例,它将成为子文档,而不是带有验证的嵌套ref/schema。
export.createOrder =  function( req, res){
   var order = new Order(req.body);
    order.address = req.address;
    order.save(callback function);
};