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