Идеальный способ хранить несколько текстов в пн goose с Node JS? - PullRequest
2 голосов
/ 16 февраля 2020

Я строю схему mon goose для текстов, которые будут отображаться на разных страницах, и она имеет конечную точку для данных POST для обновления текстов.

Например, я хотели бы хранить текстовые сообщения, которые будут отображаться / обновляться на странице «О странице» и «Страница контактов»

Каков предпочтительный способ проектирования текстовой модели?

1) Модель, в которой все сообщения хранятся в одном объекте данных

  • Во внешнем интерфейсе родительский компонент извлекает все текстовые сообщения с помощью Texts.findOne () и просачивается к нужным страницам
const textsSchema = new Schema(
  {
    aboutMessage1: {
      type: String,
      required: true
    },
    aboutMessage2: {
      type: String,
      required: true
    },
    contactMessage1: {
      type: String
    },
    contactMessage2: {
      type: String
    }
  },
  { timestamps: true }
);

2) Модель, содержащая каждое сообщение - поэтому у него будет несколько объектов

  • В fron-end каждая страница использует Text.findById (textId) для извлечения каждого сообщения
const textSchema = new Schema(
  {
    // Example: name = contactMessage
    name: {
      type: String
    },
    message: {
      type: String
    }
  },
  { timestamps: true }
);

3) Несколько моделей, содержащих текст для каждой страница

  • Аналогично подходу 1) , тексты выбираются с * 104 0 * Texts.findOne () , но выполняется на каждой странице
const aboutTextsSchema = new Schema(
  {
    message1: {
      type: String,
      required: true
    },
    message2: {
      type: String,
      required: true
    },
  },
  { timestamps: true }
);

const contactTextsSchema = new Schema(
  {
    message1: {
      type: String,
    },
    message2: {
      type: String,
    },
  },
  { timestamps: true }
);

1 Ответ

1 голос
/ 16 февраля 2020

Самый многообещающий вариант - второй. Поскольку первый и третий параметры имеют статус c, и если в будущем вам потребуется добавить новую страницу или новое сообщение к существующей странице, для этого потребуются изменения в модели mon goose и развертывание для API .

Но я думаю, что вместо создания текстовой схемы было бы лучше создать схему страницы для вашего сценария.

Здесь я встраиваю сообщения в схему страницы.

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

const pageSchema = new Schema(
  {
    page: {
      type: String
    },
    messages: [
      new Schema({
        name: {
          type: String
        },
        message: {
          type: String
        }
      })
    ]
  },
  { timestamps: true }
);

module.exports = mongoose.model("Page", pageSchema);

Теперь мы можем использовать этот почтовый маршрут для создания страницы:

router.post("/pages", async (req, res) => {
  const result = await Text.create(req.body);
  res.send(result);
});

Мы можем создать страницу и ее сообщения, используя предыдущий почтовый маршрут.

Тело запроса:

{
    "_id": "5e4937e9e2454a2c0c162890",
    "page": "About",
    "messages": [
        {
            "_id": "5e4937e9e2454a2c0c162892",
            "name": "Abou1",
            "message": "About1 message..."
        },
        {
            "_id": "5e4937e9e2454a2c0c162891",
            "name": "Abou2",
            "message": "About2 message..."
        }
    ],
    "createdAt": "2020-02-16T12:39:05.154Z",
    "updatedAt": "2020-02-16T12:39:05.154Z",
    "__v": 0
}

Ответ:

{
    "_id": "5e4937e9e2454a2c0c162890",
    "page": "About",
    "messages": [
        {
            "_id": "5e4937e9e2454a2c0c162892",
            "name": "Abou1",
            "message": "About1 message..."
        },
        {
            "_id": "5e4937e9e2454a2c0c162891",
            "name": "Abou2",
            "message": "About2 message..."
        }
    ],
    "createdAt": "2020-02-16T12:39:05.154Z",
    "updatedAt": "2020-02-16T12:39:05.154Z",
    "__v": 0
}

Если позже мы захотим добавить сообщение на страницу, мы можем использовать следующий маршрут пут.

router.put("/pages/:id", async (req, res) => {
  const result = await Page.findByIdAndUpdate(
    req.params.id,
    {
      $push: { messages: req.body }
    },
    { new: true }
  );
  res.send(result);
});

Тело запроса:

{
    "name": "Abou3",
    "message": "About3 message..."
}

Ответ:

{
    "_id": "5e4937e9e2454a2c0c162890",
    "page": "About",
    "messages": [
        {
            "_id": "5e4937e9e2454a2c0c162892",
            "name": "Abou1",
            "message": "About1 message..."
        },
        {
            "_id": "5e4937e9e2454a2c0c162891",
            "name": "Abou2",
            "message": "About2 message..."
        },
        {
            "_id": "5e493926f905ab3300106f94",
            "name": "Abou3",
            "message": "About3 message..."
        }
    ],
    "createdAt": "2020-02-16T12:39:05.154Z",
    "updatedAt": "2020-02-16T12:44:22.763Z",
    "__v": 0
}

Когда клиенту нужны сообщения страницы, все, что нам нужно сделать, - это извлечь страницу по ее идентификатору или имени страницы:

router.get("/pages/id/:id", async (req, res) => {
  const result = await Page.findById(req.params.id);
  res.send(result);
});

//or

router.get("/pages/name/:name", async (req, res) => {
  const result = await Page.findOne({ page: req.params.name });
  res.send(result);
});
...