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": "Подаются сырники со сметаной, сгущенкой или с вашим любимым джемом." } ] } }]