Поэтому у меня есть следующие схемы:
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
вероятно, не подходит.
Я думаю, вы можете использовать встроенные документы для этого, поэтому в схеме вашего элемента вы можете вставить 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()
Принудительно использовать тип по умолчанию является сложным, но mongoose
позволяет вам указать функцию вместо boolean по default
(так же, как это позволяет вам то же самое для требуемого).
Таким образом, вы могли бы сделать что-то подобное (я сократил схемы для брачности):
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
пользовательской функции по default
.Надеюсь это поможет.
default
в itemDetails info
? Моя проблема в том, что table
не инициализируется.
table
в своем вопросе. Я просто привожу пример, где вы можете использовать default
по default
как функцию для инициализации anything
вы хотите ... включая таблицу.
Item Schema
была ссылка наtype
с_id
детали элемента и что в массиве поdefaults
?