Мангуст - как получить поддокумент для соответствия схеме

1

Поэтому у меня есть следующие схемы:

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
    Таким образом, вы хотите, чтобы в деталях Item Schema была ссылка на type с _id детали элемента и что в массиве по defaults ?
  • 0
    @Akrion по умолчанию может быть просто пустой массив
Показать ещё 5 комментариев
Теги:
mongoose
mongoose-schema

2 ответа

2

Я думаю, вы можете использовать встроенные документы для этого, поэтому в схеме вашего элемента вы можете вставить 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()
0

Принудительно использовать тип по умолчанию является сложным, но 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"
  }]
}

Таким образом, это дает вам две вещи:

  1. Вы не можете поместить какой-либо тип в details отличные от itemDetails поскольку вы применяете тип с помощью itemDetails.
  2. Вы инициализируете объект ItemDetails стандартными значениями по умолчанию в своей default пользовательской функции по default.

Надеюсь это поможет.

  • 0
    Я не понимаю , почему я не мог просто переместить по default в itemDetails info ? Моя проблема в том, что table не инициализируется.
  • 0
    Хорошо, но вы ничего не упомянули о table в своем вопросе. Я просто привожу пример, где вы можете использовать default по default как функцию для инициализации anything вы хотите ... включая таблицу.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню