mongodb / mongoose - как вставить новый вложенный документ с полем вложенного массива - PullRequest
0 голосов
/ 27 августа 2018

Оригинальный вопрос : как вставить 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
    }
)

1 Ответ

0 голосов
/ 29 августа 2018

Причиной этой ошибки было определение переменных. Item было объявлено ранее Item_Detail, что означает, что в то время у него не было доступа к Item_Detail.

* 1006 Т.е. *

var Item = new Schema(...) // Item_Detail is referenced in here
var Item_Detail = new Schema(...)

исправлено с

var Item_Detail = new Schema(...) // declare before
var Item = new Schema(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...