Оригинальный вопрос : как вставить type
в качестве имени поля.
Итак, я получаю сообщение об ошибке:
CastError: Cast to embedded failed for value "{ details:\n [ { content: \'\',\n hidden: false,\n _id: \'5b83ed6410bd2b146b13741b\',\n title: \'Name\',\n order: 0 },\n { content: \'\',\n hidden: false,\n _id: \'5b83ed6410bd2b146b13741a\',\n title: \'Price\',\n order: 1 },\n { content: \'\',\n hidden: false,\n _id: \'5b83ed6410bd2b146b137419\',\n title: \'Company\',\n order: 2 } ] }" at path "items"
вот объект:
[
{
"title": "Name",
"content": "",
"hidden": false,
"order": 0,
"type": "text"
},
{
"title": "Price",
"content": "",
"hidden": false,
"order": 1,
"type": "text"
},
{
"title": "Company",
"content": "",
"hidden": false,
"order": 2,
"type": "text"
}
]
У меня есть запрос:
ListModel
.findOneAndUpdate(
{
_id: list_id
},
{
$push: {
items: {
details: the_template
}
}
}
)
который пытается сделать вставку / обновление
Я не уверен, что это за ошибка.
Отмечая , что я вставляю новый item
в массив items
. Это работает, если я сначала создаю элемент, а затем обновляю его с помощью запроса $push: {details}
.
Вот схемы.
Схема списка:
var List = new Schema(
{
items: {
index: true,
type: [Item]
},
hidden: {
default: false,
index: true,
type: Boolean
},
name: {
index: true,
type: String,
},
item_details_template: {
default: [
{
"title": "Name",
"content": "",
"hidden": false,
"order": 0,
"type": "text"
},
{
"title": "Price",
"content": "",
"hidden": false,
"order": 1,
"type": "text"
},
{
"title": "Company",
"content": "",
"hidden": false,
"order": 2,
"type": "text"
}
],
type: [Item_Detail]
},
// Other users who have access
shared_with: {
index: true,
refs: "users",
type: [Shared_With]
},
// Owner
user_id: {
index: true,
ref: "users",
required: true,
type: ObjectId,
}
},
{
strict: false
}
)
Схема товара:
var Item = new Schema(
{
// Template_Item
based_on: {
index: true,
type: ObjectId
},
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&",
index: true,
type: String
},
hidden: {
default: true,
index: true,
type: Boolean
},
tags: {
default: [],
index: true,
type: [Tag]
}
},
{
strict: false
}
)
ItemDetail Schema:
var Item_Detail = new Schema(
{
content: {
default: "",
index: true,
type: String,
trim: true,
validate: {
validator(v)
{
if (this.title.trim() === "price")
{
return !isNaN(v.trim())
}
return true
}
}
},
hidden: {
default: false,
index: true,
type: Boolean
},
order: {
index: true,
required: true,
type: Number
},
table: {
default: {},
type: Mixed
},
title: {
required: true,
index: true,
type: String,
},
type: {
default: "text",
enum: ["text", "table"],
index: true,
type: String
},
},
{
strict: false
}
)