【问题标题】:Saving Mongoose nested schema保存 Mongoose 嵌套模式
【发布时间】:2014-03-02 16:00:04
【问题描述】:

我在保存嵌套子文档时遇到问题 - 不确定是因为它不是数组还是什么 - 文档似乎暗示嵌套对象是自动保存的,但在这种情况下它们不是。

子架构:

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();

这给出了一个 Cast to ObjectId failed 错误:

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

这似乎可行的唯一方法是先保存子文档,我想避免这样做,因为我有多个地址,所以有点乱。

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

【问题讨论】:

    标签: javascript node.js mongoose


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      主架构中的地址对象应该是 Schema.Types.Mixed 类型。您指定该地址应该是一个 ObjectId,这就是您收到 Cast to ObjectId 错误的原因。

      http://mongoosejs.com/docs/schematypes.html

      例子:

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

      【讨论】:

      • 这变成了一个子文档,而不是一个带有验证的嵌套 ref/schema。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        要使其保存地址架构,您需要在函数中执行保存订单的所有操作: var 地址 = mongoose.model('地址'); 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 的示例

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-22
          • 2017-07-06
          • 2020-04-22
          • 2015-07-18
          • 1970-01-01
          • 2014-11-09
          • 1970-01-01
          相关资源
          最近更新 更多