所以我有以下模式:
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
的子文档,但是我不确定如何强制执行default
和type
限制。我也不希望Item_Detail
本身就是一个集合,因此使用create
或save
可能不合适。
答案 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"
}]
}
所以这给你两件事:
details
之外的itemDetails
中放置任何类型,因为您已使用itemDetails
强制了该类型。ItemDetails
自定义函数中使用所需的默认值初始化default
对象。希望这会有所帮助。