猫鼬-如何使子文档符合架构

时间:2018-08-09 07:27:11

标签: javascript mongodb mongoose mongoose-schema

所以我有以下模式:

var Item_Detail = new Schema(
    {
        content: {
            index: true,
            type: Array
        },
        is_private: {
            default: false,
            index: true,
            type: Boolean
        },
        order: {
            index: true,
            required: true,
            type: Number
        },
        table: {
            default: {},
            type: Object
        },
        title: {
            required: true,
            index: true,
            type: String,
        },
        type: {
            default: "text",
            enum: ["text", "table"],
            index: true,
            type: String
        },
    },
    {
        strict: false
    }
)

const Item = new Schema(
    {
        details: {
            default: [],
            index: true,
            type: [Item_Detail],
        },
        display_name: {
            default: "",
            index: true,
            type: String,
        },
        image: {
            default: "http://via.placeholder.com/700x500/ffffff/000000/?text=No%20Image&",
            type: String
        },
        is_private: {
            default: false,
            index: true,
            type: Boolean
        },
        tags: {
            index: true,
            type: [Tag]
        }
    },
    {
        strict: false
    }
)

现在,Item_Detail将成为Item的子文档,但是我不确定如何强制执行defaulttype限制。我也不希望Item_Detail本身就是一个集合,因此使用createsave可能不合适。

2 个答案:

答案 0 :(得分:2)

我认为您可以为此使用embedded documents,因此在您的项目架构中您可以嵌入 item_detail:

const Item = new Schema({
    ...
    item_detail: item_detail
})

然后在服务器上,要添加item_detail时,可以执行以下操作

myItem = new Item({//enter item data here})
//assign item detail here
myItem.item_detail = item_detail ;

然后继续保存

myItem.save()

答案 1 :(得分:0)

强制类型很容易,默认值很棘手,但是mongoose允许您specify a function而不是default的布尔值(就像它允许您same for required )。

因此,您可以执行以下操作(为求勇敢,我简化了架构):

const itemDetails = new Schema({
  info: {
    type: String,
    required: true
  }
})

const item = new Schema({
  details: {
    default: function() {
      return [new ItemDetails({ info: 'N/A' })]
    },
    type: [itemDetails],
  }
})

这将允许您执行以下操作:

var itm = new Item();

保存的结果将是:

{
  "_id": ObjectId("5b72795d4aa17339b0815b8b"),
  "details": [{
    "_id": ObjectId("5b72795d4aa17339b0815b8c"),
    "info": "N/A"
  }]
}

所以这给你两件事:

  1. 您不能在details之外的itemDetails中放置任何类型,因为您已使用itemDetails强制了该类型。
  2. 您可以在ItemDetails自定义函数中使用所需的默认值初始化default对象。

希望这会有所帮助。