MongoDB / mon goose - имеет ли эта связь смысл? - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь построить взаимосвязь между modules collection и languages collection.

Модули представляют собой один конкретный c учебный ресурс. Скажем, абзац из книги состоит из 30 слов. Если мне нужно создать модуль на основе этого абзаца, тогда я хочу, чтобы в моем модуле был вложенный документ из этих 30 слов.

Языки представляют, ну язык. Моя текущая мысль состоит в том, чтобы иметь document в моем languages collection для каждой языковой категории (французский, английский sh, немецкий и т. Д.), И в каждом из этих документов есть вложенный документ всех ~ 4000 слов, которые в настоящее время существуют в этом язык в базе.

Итак, вот моя попытка объяснить проблему:

  • Я вошел в систему как администратор на моем сайте. Есть параграф французских слов, который я хочу сохранить в Modules Collection моей базы данных. Мы назовем этот документ «Урок французского 1».
  • Я не хочу создавать новые слова из воздуха и передавать их в мой новый документ модуля «Урок французского 1».
  • Я хочу найти слов, которые уже существуют в моем French document в моем Languages collection.
  • Если слово существует, отлично. Если нет, то его нужно создать в French document.
  • Как только слово будет найдено в French document в моем Languages collection, я хочу, чтобы мой модуль "Урок французского Поддокумент слова размером 1 дюйм, указывающий на это слово, производное от моего French document.

Схема модуля

const ModuleSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true,
  },
  media: {
    type: String,
    enum: ['Advertisement', 'Traditional', 'Other'],
    required: true,
  },
  difficulty: {
    type: String,
    enum: ['Beginner', 'Intermediate', 'Advanced'],
    required: true,
  },
  producer: {
    type: ObjectId,
    ref: 'producers',
    required: true,
  },
  summary: {
    type: String,
    default: 'No summary provided.',
    minlength: 20,
    maxlength: 250,
  },
  language: {
    type: ObjectId,
    ref: 'languages',
    required: true,
  },
  topics: [
    {
      type: ObjectId,
      ref: 'topics',
      required: true,
    },
  ],
  words: [
    {
      wordId: {
        type: ObjectId,
        ref: 'languages.words',
        required: true,
      },
      word: {
        type: String,
        required: true,
      },
    },
  ],
});

Языковая схема

const LanguageSchema = new mongoose.Schema({
  language: {
    type: String,
    enum: ['French', 'English', 'Spanish', 'German'],
    required: true,
  },
  origin: {
    type: String,
    enum: ['Latin', 'Asiatic', 'Germanic', 'Other'],
    required: true,
  },
  words: [
    {
      word: String,
      partOfSpeech: {
        type: String,
        enum: ['noun', 'verb', 'adverb', 'adjective'],
        required: true,
      },
      audio: String,
      kinId: [
        {
          languageId: ObjectId,
          wordId: ObjectId,
        },
      ],
    },
  ],
});

При условии, что эта схема и настройка вложенного документа имеют смысл. Как я могу go создать и обновить схему модуля для поиска, а затем ссылаться на связанные слова в документе на правильном языке? Может ли это облегчить mon goose или для этого потребуется более сложная JS смазка для локтей?

На данный момент я придумываю такое решение: когда я начинаю создавать это модуля, я записываю слова, разбиваю их на массив, а затем перебираю каждое слово в массиве, а затем ищу эту работу в соответствующей языковой коллекции (это означает, что мне нужно заранее получить доступ к идентификатору коллекции). Если он существует, я добавляю его идентификатор (или, возможно, все его данные) в только что созданный модуль. Я не знаю, хорошая ли это идея, поскольку, если мы будем использовать приведенный выше пример, потребовалось бы 30 различных операций чтения (каждое слово в массиве), чтобы найти слово в связанном language document, а затем 30 записей во вложенный документ модуля, чтобы добавить эти слова в модуль.

Еще одно соображение заключается в том, что если я удалю или изменю слово, его придется (как я понимаю вручную) обновлять по всей базе данных. Может быть волосатым.

бонус: Какого черта вы называете словом, имеющим такое же значение на другом языке? Красный, гниль, румяна, роя? Я все время нахожу родственные в гугле ...

...