February 18, 2021

7. Структура данных для хранения

Поскольку цель моего приложения - хранение и выдача по запросу из телеграмма рецептов я решил начать с главного - взять один из предложенных в интернете рецептов и попробовать структурировать его.

Вот тот вариант, который был мне предложен:

https://www.instagram.com/p/B9G7HxmBA17/?igshid=1bgahbqn9oux6

В MongoDB с помощью родной утилиты MongoDBCompass можно загружать в БД данные из файлов друх расширений: JSON или CSV. Что очень удобно, поскольку освобождает от необходимости вести сложно структурированные данные руками.

Я сразу решил, что вырисовывать JSON руками не мой конек, поэтому воспользовался одним из популярных xml-to-json конвертеров.

https://codebeautify.org/xmltojson

Поначалу все шло довольно бодро - я скопировал текст и начал покрывать его тегами:

<title> - для заголовка рецепта

<composition> - для состава, в котором были

<ingredient> - для каждой позиции состава, содержащие также

<name> - наименование, <weight> - вес, <unit> - ед. измерения.

Структура получалась с большим количеством вложенностей. Но поскольку я слабо представляю какие-то запросы в стиле : все рецепты, содержащие ингредиент "мука" для каталога, данная схема на текущем этапе меня вполне устраивала.

И вот первые неожиданности: мука 100-130 гр.

Задуманная мной структура подразумевала ввод числа в поле <weight>, одного числа, не диапазона. Я решил пока не заморачиваться с необходимостью ведения range-поля и просто добавил еще одну вложенность <weight> c <min>, <max>. Если данное решение окажется недостаточно гибким или неудобным в дальнейшем я его пересмотрю.

И второе: приписки в конце - (по желанию), (для обжарки). Добавил для каждой позиции <ingredient> поле <comment>. Думаю, пригодится.

В целом, структура готова и в таком виде хорошо подгружается в MongoDB.

Пример прикладываю ниже, если кто захочет - сможет проскроллить.

[{ "title": "Сырники с рикоттой",
  "composition": {
    "ingredient": [
      {
        "name": "Рикотта",
        "weight": {
          "min": 230
        },
        "unit": "гр"
      },
      {
        "name": "Яйцо",
        "weight": {
          "min": 60
        },
        "unit": "гр"
      },
      {
        "name": "Сахар",
        "weight": {
          "min": 20
        },
        "unit": "гр"
      },
      {
        "name": "Соль",
        "weight": {
          "min": 2
        },
        "unit": "гр"
      },
      {
        "name": "Разрыхлитель",
        "weight": {
          "min": 2
        },
        "unit": "гр"
      },
      {
        "name": "Ванильный экстракт",
        "weight": {
          "min": 2
        },
        "unit": "гр",
        "comment": "по желанию"
      },
      {
        "name": "Мука",
        "weight": {
          "min": 100,
          "max": 130
        },
        "unit": "гр"
      },
      {
        "name": "Растительное масло",
        "comment": "для обжарки"
      }
    ]
  },
  "cooking": {
    "step": [
      {
        "num": 1,
        "content": "Слегка взбиваем яйцо с сахаром."
      },
      {
        "num": 2,
        "content": "Добавляем рикотту, мешаем вилкой."
      },
      {
        "num": 3,
        "content": "Соединяем муку с солью и разрыхлителем."
      },
      {
        "num": 4,
        "content": "По желанию можно использовать ванильный экстракт."
      },
      {
        "num": 5,
        "content": "В полученную массу добавляем муку, до тех пор, пока творожная масса не будет браться за руки."
      },
      {
        "num": 6,
        "content": "После чего высыпаем муку немного на стол, либо в тарелку, от готового теста отрываем небольшой кусочек и формируем небольшие шарики. Обваливаем их в муке."
      },
      {
        "num": 7,
        "content": "Затем всё это выкладываем на разогретую сковородку с растительным маслом, и жарим сырники на небольшом огне."
      },
      {
        "num": 8,
        "content": "Наблюдаем за готовностью, переворачивая сырники с одной стороны на другую."
      },
      {
        "num": 9,
        "content": "Подаются сырники со сметаной, сгущенкой или с вашим любимым джемом."
      }
    ]
  } 
}]