保存Mongoose嵌套模式

时间:2014-02-05 23:03:53

标签: javascript node.js 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"
  }
});

这些都不会起作用。

创建doc不会抛出错误但不保存subdoc

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

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

这会导致Cast to ObjectId失败错误:

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

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

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

4 个答案:

答案 0 :(得分:0)

确定。显然我们不能在没有数组的情况下使用subdocs。请参阅SO帖子Embedded document without Array?和错误线程解释推理:https://github.com/LearnBoost/mongoose/pull/585

答案 1 :(得分:0)

主模式中的地址对象应为Schema.Types.Mixed类型。您指定该地址应该是ObjectId,这就是您将Cast转换为ObjectId错误的原因。

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

示例:

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

答案 2 :(得分:0)

确定。如果您只需要一个带有子字段的字段,则不需要其他架构,您可以这样:

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

答案 3 :(得分:0)

要保存地址架构,您需要在函数中执行以下操作以保存订单: 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);
}; 

请注意这是使用node,express

的示例