yopp
Универсальных рецептов нет. Плюс документных хранилищ что в них можно писать что угодно, а уже потом разбираться что с этим делать. Минус — в них можно писать что угодно и потом придётся разбираться что с этим делать. Если есть возможность, то писать так, как вы будете читать. Тогда не будет очень больно.
Nor
Доку я читал. Но у меня немного другая история У меня динамическая таблица с настройкой отображения - нужно получить по апи список полей - задать им человекочитаемые алиасы и привязать к блокам для отображения.
yopp
Т.е. делать все возможные вычисления когда вы пишите документ, а не когда читаете.
Nor
Струтуру-то я организовал, но таблица api_config начала разрастаться и знает и о настройках подключения и о настройках вывода
Nor
И есть предположение что надо разбивать ответсвтенность.
yopp
Смотрите вебинары
yopp
Начните с первой ссылки на блог
yopp
Прочитайте три части, потом смотрите вебинары которые в подвале поста в блоге
yopp
Потому что это не к монге вопрос, а к вам.
yopp
Документные хранилища позволяют плавно регулировать степень нормализации/денормализации данных
yopp
И выбор за вами, а точнее за вашими паттернами доступа
yopp
Ещё раз повторю: основная идея писать так, как вы будете читать. Т.е. по возможности не читать лишнего и не делать сложных трансформаций со склейкой данных из нескольких коллекций.
Nor
Благодарю.
Andrey
ребят, вопрос ,возможно, по Го, но тем не менее, есть какой-то устоявшийся паттерн работы с монгой в долгоиграющем приложении, частые запросы, каждый из них транзакция я сделал следующим образом: 1) есть канал с операциями, куда отсылаются функции которые принимают в аргументе sessionContenx и возвращают error 2) при инициализации приложения, создается цикл по этому каналу 3) при поступлении данных в канал забирается функция, создается сессия, создается транзакция 4) вызывается функция с аргументом созданного контекста, если вернулась ошибка вызываем abortTransaction, иначе commit вопрос: по какому принципу выстроить политику retry? проблема в том, что не могу пустить весь вызов на 2й круг, поскольку в пробрасываемой функции возможна запись в канал к которому нет доступа?
Vladimir
Приперся снова с вопросом по монге Есть массив episodes: [{ type: Schema.Types.ObjectId, ref: "Episode" }], Который по идеи должен хранить только: [ObjectId("5c58552e04a97202de2a6c4a"), ObjectId("5c58552e04a97202de2a6sas")] Но при вставке вставляется объект вот такого вида
Vladimir
Всем привет. Помогите пожалуйста с проблемой, бьюсь битый час
Vladimir
Кто нибудь? Я что-то делаю не правильно? Пытаюсь достичь связи 1 ко многим
Nick
а поля number sequence это тиап из Episode?
Vladimir
Да
yopp
Кто нибудь? Я что-то делаю не правильно? Пытаюсь достичь связи 1 ко многим
храните id родителя в дочерних объектах, а не в родителе
Vladimir
А как я потом подгружу эпизоды, из родителя если у родителя не будет айди на эпизоды?
yopp
по id родителя
yopp
db.episodes.find({season_id: OID})
Nick
там ж монгус
Nick
он сам все делает
yopp
ну значит в монгусе направление отношений не в ту сторону обращено
yopp
Season has many episodes. Episode belongs to season
Vladimir
Я через мангуста И делаю так: await Show.paginate({}, {populate: { path: "episodes", select: "sequence" }}, (err, res)
Nick
populate работает при выборке, а не при сохранении
Vladimir
Это, я уже выборку делаю, показываю как
Vladimir
И вот в шоу у меня будет чистый массив из ObjectId, то все подгружает прекрасно
Nick
покажите как заполняете sequence
yopp
если это так делает монгус, монгус надо выбросить, он сломан
yopp
идеалогически
Nick
а почему бы и нет?
Vladimir
> покажите как заполняете sequence sequence - просто массив объектов. Он статичный заполнялся раз, когда был парсинг. Я его не заполняю > если это так делает монгус, монгус надо выбросить, он сломан Подскажите каким образом мне лучше всего организовать связь 1 ко многим? В чем мой выбор ошибочен?
Vladimir
Есть эпизоды, есть шоу. У шоу лежит массив с айдишками эпизодов. Разве это плохо? И почему плохо?
yopp
потому что это массив
yopp
и это уже проблема
yopp
начиная с того что в массиве элементы никто не запрещает дублировать
yopp
заканчивая тем, что индексы по массивам это не тоже самое что индексы по полям
Vladimir
Им невозможно задублироваться
yopp
ваше утверждение ложно
Vladimir
> заканчивая тем, что индексы по массивам это не тоже самое что индексы по полям можно подробнее пожалуйста?
Nick
sequence - просто массив объектов. Он статичный заполнялся раз, когда был парсинг. Я его не заполняю вот тут может и быть проблема, хотя давно уже с монгусом не игрался, но прям чую что там вы должны явно задават ьсписок id, а не просто фигачить объекты
yopp
массивы в bson это поддокументы, где ключом является «индекс». как следствие вы сразу теряете covered queries
Vladimir
С чем лучше монго готовить в ноде?
Nick
то что вам надо назвается не ref а https://mongoosejs.com/docs/subdocs.html
yopp
не знаю
Vladimir
> массивы в bson это поддокументы, где ключом является «индекс». как следствие вы сразу теряете covered queries аргумент. Принял во внимание
yopp
т.е. источник связи в виде дочерного документа это самый логичное и направление отношения
yopp
второй момент: если у вас внезапно появится много детей, вы можете уперется в лимит по размеру документов.
Vladimir
> то что вам надо назвается не ref а https://mongoosejs.com/docs/subdocs.html Дело в том что от вложенных документов я и убежал. Потому что, выходит что у меня эпизоды могут расти безгранично. А где-то читал что в монго плохо хранить большие массивы, которые постоянно меняют свой размер
yopp
это устаревшая информация
yopp
но есть другая проблема: размер документа ограничен
Vladimir
То есть могу смело делать сабдокументы и не переживать что длинна массива сабдокументов может расти безгранично?
yopp
я бы ввёл понятие сезона, и у же в нём бы хранил эпизоы
yopp
а из сезона бы ссылался на шоу
Vladimir
Бесконечно, я имею ввиду что в одном шоу может быть 0 эпизодов и хранится пустой массив. А в другом 10 тысяч эпизодов
yopp
так как есть шоу с огромным количеством эпизодов
yopp
но обычно сезон ограничен несколькими десятками эпизодов
Vladimir
Ага, разбивать еще больше. В начале про это и думал
Vladimir
Это абстрактный пример
yopp
вообще храните так, как это будет отображатся
Vladimir
С сезонами и эпизодами
yopp
например в случае с myshows, там более логично хранить эпизоды отдельно
Vladimir
> какая информация хранится в описании эпизода? Дата, описание, Заголовок
yopp
хотя
yopp
эпизод без сезона используется только на странице с эпизодом, в остальных местах почти всегда весь сезон целиком
Vladimir
Да
Vladimir
Подводя итоги Если данных будет много, ввести понятие Сезона, и тогда дробить на 3 коллекции? Шоу - Сезон - Эпизод ?
yopp
можно остановится на двух: шоу и сезон. А в сезоне хранить эпизоды как вложенные документы
yopp
главное чтоб у эпизодов тоже _id был
yopp
но вы исходите из того как вы будете извлекать эти данные из базы
Vladimir
Ну сейчас у меня так и есть Шоу - Сезон, у сезона есть _id, и массив эпизодов