модель mon goose, массив строк, структура массива объектов - PullRequest
1 голос
/ 14 марта 2020

Я пытаюсь создать свою модель базы данных, и я не знаю, как в нее вписать array из strings и array из objects. Моя текущая модель:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const schema = new Schema({
    email: { type: String, unique: true, required: true },
    hash: { type: String, required: true },
    createdDate: { type: Date, default: Date.now },
    settings: {
        favorites: { /* ??? */ },
        cart: { /* ??? */ },
        states: {
            favorites: { type: Boolean, default: true },
            search: { type: Boolean, default: false },
            category: { type: Schema.Types.Mixed, default: false }
        }
    }
});

schema.set("toJSON", { virtuals: true });

module.exports = mongoose.model("User", schema);

favorites структура данных ['234', '564', '213', '782']

cart пример структуры данных:

[
    { quantity: 5, marketId: '234' },
    { quantity: 2, marketId: '564' },
    { quantity: 7, marketId: '213' },
    { quantity: 3, marketId: '782' }
]

Как добавить это как конфигурация для mongoose модели?

1 Ответ

1 голос
/ 14 марта 2020

Избранное должно быть массивом строк следующим образом: favorites: [String]

Для массива корзины у нас есть два основных варианта:

  1. Мы можем определить корзину как массив subdocuments.
const schema = new Schema({
  email: { type: String, unique: true, required: true },
  hash: { type: String, required: true },
  createdDate: { type: Date, default: Date.now },
  settings: {
    favorites: [String],
    cart: [
      {
        quantity: Number,
        marketId: String
      }
    ],
    states: {
      favorites: { type: Boolean, default: true },
      search: { type: Boolean, default: false },
      category: { type: Schema.Types.Mixed, default: false }
    }
  }
});
Или мы можем объявить корзину как массив schema types.
const schema = new Schema({
  email: { type: String, unique: true, required: true },
  hash: { type: String, required: true },
  createdDate: { type: Date, default: Date.now },
  settings: {
    favorites: [String],
    cart: [
      new Schema({
        quantity: Number,
        marketId: String
      })
    ],
    states: {
      favorites: { type: Boolean, default: true },
      search: { type: Boolean, default: false },
      category: { type: Schema.Types.Mixed, default: false }
    }
  }
});

Для них обоих, когда вы создаете документ, он будет выглядеть следующим образом, обратите внимание, что mon goose добавлено поле _id в элементах карты.

{
    "settings": {
        "states": {
            "favorites": true,
            "search": false,
            "category": false
        },
        "favorites": [
            "234",
            "564",
            "213",
            "782"
        ],
        "cart": [
            {
                "_id": "5e6cd0bd53feb32d50699b79",
                "quantity": 5,
                "marketId": "234"
            },
            {
                "_id": "5e6cd0bd53feb32d50699b78",
                "quantity": 2,
                "marketId": "564"
            },
            {
                "_id": "5e6cd0bd53feb32d50699b77",
                "quantity": 7,
                "marketId": "213"
            },
            {
                "_id": "5e6cd0bd53feb32d50699b76",
                "quantity": 3,
                "marketId": "782"
            }
        ]
    },
    "_id": "5e6cd0bd53feb32d50699b75",
    "email": "abc@def.net",
    "hash": "hash...",
    "createdDate": "2020-03-14T12:40:29.969Z",
    "__v": 0,
    "id": "5e6cd0bd53feb32d50699b75"
}

Если вы не хотите, чтобы _id полей в массиве корзины, вы можете добавить _id: false опцию схемы корзины следующим образом:

    cart: [
      new Schema(
        {
          quantity: Number,
          marketId: String
        },
        { _id: false }
      )
    ],

Вот несколько полезных документов:

Массивы

Субдокументы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...