Vlad
у вас монгус?
Нет, чистый клиент, самописная одм
Алексей
Ребят, всем привет, подскажите пожалуйста, возможно ли то, что я хочу сделать? Есть документ A, у которого есть поле networks - это массив объектов. Структура объекта: { currency: Types.ObjectId; amount: number; } На входе я имею некий массив values, структура которого аналогична полю networks Я хочу одним запросом .updateOne() обновить поле networks, прибавив каждому полю amount значение из принадлежащего ему объекта в поле values (определяется по полю currency).
Алексей
в монге так можно?
Алексей
насчёт того, что проще - согласен. но в итоге столкнулись с тем, что при частых запросах от чедулера + по сокету данные перезаписываются((
T~B
Привет, подскажите как в логах монги идентификации действий пользователя в бд mongodb пишет uuid "....". как то можно сопаставить username и uuid ? Хочу узнать от какого пользователя делался запрос
Bretbas
Народ, подскажите пожалуйста КТо нибудь встречал MongoDB.Driver.MongoNotPrimaryException: Server returned not primary error.
Dmitry
я ему написал 3 варианта решения, очевидно, человек пришёл свою точку зрения отстаивать, а не читать ответы на вопросы и делать как полагается
Не обижайтесь, спасибо за ваши предложения. На то мы и разработчики, чтобы отстаивать своё мнение
Асхат
Всем привет, кто может подсказать?.. есть два докер контейнера с монгодб.. надо зайти с одного контейнера в другой и просмотреть базы
Асхат
Как это можно реализовать?
Асхат
А через какую команду монги? mongo --host <название контейнера> или сетевой адрес контейнера?
Асхат
У меня почему то команду mongo не определяет
Нуриддин
Если при docker run даш флаг --hostname то можно
Нуриддин
Но только если они в одно docker network
Нуриддин
Я понял по другому, ну вчё прокидывай порт из хоста или запускай монго консоль из контейнера и работай как удобно
FOR YOU
Всем привет! Подскажите, как считаете, в монго нормально реализованы транзакции и принципы ACID? ПыСы: документацию читал, все смотрел Но хотел бы узнать личный опыт Вопрос исследовательский, можно ли будет в дальнейшем полностью отказаться от реляционный бд в пользу nosql, где существуют ACID и транзакции Не кидайте камни, надо научную статью писать..
Easy Rider
если у тебя возникает конфликт записи в рамках транзакции, монга его не решает, а просто выдает ошибку. предполагается что ты сам должен повторно проводить транзакцию. существуют утилиты, которые облегчают эту задачу, но все равно это выглядит убого
Easy Rider
короче, транзакции это не аналог оператора lock например в C#, который гарантирует что одновременно участок кода может выполняться только одним потоком. тут такого нет, все что в рамках транзакции, может одновременно выполняться несколькими потоками, процессами и тд..... просто если возникает конфликт, все откатывается. но что делать после этого, ты должен решать сам.
Easy Rider
а конфликты возникают очень-очень часто. ну фактически, почти всегда. если в базу пишется что-то, операция записи же может выполняться много миллисекунд, и если паралельно идет запись в разных местах, то у тебя 100% возникнет конфликт максимум в течение нескольких секунд.
Easy Rider
что делает монга при этом? Ничего. Просто выдает ошибку. Специальные утилиты прикрученные сбоку изолентой, наподобие WithTransaction, при этом будут повторять попытку записи до победного конца, выглядит это решение сомнительно по эффективности, т.к. время когда монге наконец удатся провести транзакцию, не гарантированно
Easy Rider
Но зато в монге есть куча способов выплнять операции атомарно. По возможности именно так и надо делать. Но это порой, довольно сложно. Сами операторы эти весьма сложны.
Easy Rider
Реляционные БД основаны на строгой математической модели, которая сама, уже в силу своей строгости, решает массу проблем. А монга это просто коллекции. Ну то есть все равно что массивы или списки в любом ЯП, только с продвинутыми фичами вроде сохранения на диск, индексами и тд, но если попытаться использовать это для серьезной бизнес-логики, то у тебя со временем появится куча проблем по поводу того как сохранять консистентность базы, а в РСУБД такая консистентность обеспечивается просто математикой. Подозреваю что многие, как и я, недооценили в свое время предупреждения о том что монгу надо использовать только в довольно узких сценариях, и ей не следует пытаться заменить РСУБД.
FOR YOU
на научную статью это не тянет
Научная статья нынче от 3 страниц, так что как раз
FOR YOU
И я ж не в Q1 собираюсь..
Easy Rider
научная статья должна открывать что-то новое, а тут этого нет. это тянет на очередную статью на хабре на тему "как я соблазнился легкостью монгодб и огреб геморой на пол жизни". там таких уже много
FOR YOU
научная статья должна открывать что-то новое, а тут этого нет. это тянет на очередную статью на хабре на тему "как я соблазнился легкостью монгодб и огреб геморой на пол жизни". там таких уже много
Есть разные подходы в построении хранилищ данных больших систем, например в сфере ecom Стоит вопрос, использовать polyglot persistence, мультимодальную дб или придумывать, что то свое Как вариант был, это отказ от реляционнки в пользу nosql и тогда в первом подходе мы избавимся от одного вида БД -> уже что-то новое Научная статья не должна быть про великие открытия и то, как все у тебя хорошо получилось Открой semanticscholar и посмотри про что люди пишут, бывают статьи, которые пишут об одном и том же
Easy Rider
для каких-то научных применений, например, для того чтобы писать быстро какие-нибудь данные с датчиков, она конечно подходит как нельзя лучше. особенно если эти данные не структурированные. но если есть сложные отношения между сущностями, то в монге тебе самому придется реализовывать функционал РСУБД, но при этом будет куча багов, и все сценарии ты не предусмотришь
FOR YOU
Это уже понял, спасибо, что пояснил)
Easy Rider
Удаление аккаунта юзера с сайта выглядит как-то так... А в РСУБД это были бы связанные сущности, достаточно было бы удалить одну и каскадно бы удалились все с ней связанные. А тут придется еще возвращаться, что-то добавлять, если у тебя добавилась коллекция.
Ящик водки
Не обижайтесь, спасибо за ваши предложения. На то мы и разработчики, чтобы отстаивать своё мнение
при чём тут обиды вообще? у меня статус и возраст не позволяют обижаться, это удел глупцов. отстаивать в твоём случае не нужно ничего, нужно задавать вопросы и впитывать информацию от более образованных людей в вопросах, которые были заданы
Easy Rider
ох уж эти хлебушки не соблюдающие ACID...
В данном случае acid вообще не причем. Тут транзакции нет. Из опыта работы с моего я понял что транзакций в ней следует избегать любым способом.
Easy Rider
что бы не пороть чушь, советую эту книгу, как минимум от корки до корки
Прочитал немного, не от корки до корки, а того что касается транзакций в nosql, там так и пишут - в нем понятие acid не определено так же четко как в реляционных базах и под ним может подразумеваться что угодно. А в чем чушь? Что такое по сути монго? В нем нет модели. Просто набор коллекций, которые ты сам между собой согласуешь как хочешь, но никаким принципам это следовать не обязано.
Alexander
Удаление аккаунта юзера с сайта выглядит как-то так... А в РСУБД это были бы связанные сущности, достаточно было бы удалить одну и каскадно бы удалились все с ней связанные. А тут придется еще возвращаться, что-то добавлять, если у тебя добавилась коллекция.
Не надо удалять данные из БД. Надо помечать их удалёнными. Ну и внимательно думать над структурой. Да, надо садиться и проектировать. И да, подходы из реляцих БД не всегда напрямую применимы.
Easy Rider
Читаю и не понимаю плакать мне, или смеяться... Дело в том, что у меня огромный проект на монге и именно с базой проблем нет никаких. Что-то не так делаю, наверно.
Че за проект? Я делал 2 проекта. Тот который сейчас, еще относительно прост. Предыдущий был сайтом организации туристических походов и поиска попутчиков. Там какие-то тонны быдлокода приходилось городить чтобы базу поддерживать в согласованном состоянии. В реляционных бд надо было бы просто изначально продумать схему. Дальше поддержка согласованности бы обеспечивалась субд
Alexander
Тогда нужен бесконечный диск, а я же не Гугл. Если все это крутится на впс за 5 баксов в месяц
Диски стоят копейки. Если у тебя такой поток, что это проблема, то у тебя что-то реально крупное и это не проблема. Либо что-то очень специфическое.
Easy Rider
Модель есть всегда. Когда мне говорят, что монга "схемалесс", я груснею и иду искать другого собеседника. Схема описана в коде. Так и с РСУБД тоже схема описана и в коде тоже.
В моего даже нет понятия «внешний ключ», какая еще модель? Ну где-то на бумаге или в голове да, но субд о твоей модели ничего не знает и о том как коллекции между собой связаны, каждое действие по поддержке согласованности должно быть закодировано тобой лично в императивном стиле
Alexander
Ну, к слову, про применимость монги в небольших проектах можно порассуждать. Постгрес удобен нет, что он много где есть "менеджед". Но это совсем другая история...
Easy Rider
Да. На уровне кода это прекрасно делается. Тебе не нужно делать это на уровне базы.
Делается. Но это дополнительный гемор, там где его могло не быть.
Alexander
У меня был
Значит ты делал что-то неправильно.
Easy Rider
Alexander
Нормально делай, нормально будет. :-) А говорить, что монга для специальных кейсов, это крайне странно и как бы намекает, что тымне разобрался с тем, как с ней работать.
Alexander
Добавлю, что про то, что по возможности надо пользоваться атомарными операциями, у тебя мысль верная. Ещё поддерживаю.
Easy Rider
Нормально делай, нормально будет. :-) А говорить, что монга для специальных кейсов, это крайне странно и как бы намекает, что тымне разобрался с тем, как с ней работать.
Можно сделать на монге все что угодно, но простой пример, я выше скрин кидал. Мы удаляем юзера. И есть еще десяток коллекций, в которых есть Id юзера. Сами по себе документы с идом этого юзера не исчезнут. Потому что схемы нет. Надо будет написать код удаления из каждой коллекции. И таких случаев в небольшом проекте может быть много. Пока ты просто добавляешь данные, все отлично. Но когда тебе надо их редактировать и тем более удалять, начинаются раздумья «а где еще в этот момент что-то может пойти не так»
Alexander
Ещё раз напомню, что у меня не "небольшой" проект. И подобных проблем мы в реальной жизни не наблюдаем. :-)
Easy Rider
Не надо удалять данные. В этом месте уже сломано. Потому что ссылки на удалённый объект могут быть в других сервисах, логах и прочем — будет очень трудно найти концы. Т.е. ты изначально неверно решаешь задачу, вне зависимости от БД.
Если не удалять, то однажды они просто засрут весь диск, те же логи например или у меня там есть рефреш токены для авторизации, или счетчик посетителей. В основном я старался использовать capped или ttl индексы для таких вещей, ну то есть они в любом случае сами удаляются
Easy Rider
Посчитай, через сколько времени это произойдёт. Доживут ли твои правнуки? :-)
Какой-нибудь ддос начнется или зациклится какая-нибудь хрень и все. И я исхожу из того, что бекенд должен одинаково хорошо работать как на супер-ЭВМ так и на одноядернике с гигом оперативки.
Easy Rider
В счетчике посетителей к меня например каждый запрос к апи пишется вместе со всеми заголовками и телом post. По моим расчетам, при нормальной работе, этого хватит на полгода. Зачем мне хранить данные о всем этом, давно ненужные? К тому же если размер коллекции растет, то индексы не влезут в рабочий набор и скорость критически просядет
Easy Rider
Преждевременная оптимизация. :-)
Когда начнется ддос на продакшне во время рекламной кампании будет уже поздно думать об оптимизации
Easy Rider
Зачем сохранять весь запрос?
Это можно использовать для защиты от ддоса, чтобы понимать где точно робот.
Alexander
Это можно использовать для защиты от ддоса, чтобы понимать где точно робот.
Сохраняй в отдельное хранилище с адекватным ttl. Например, в логах.
Alexander
Это не данные твоей бизнес-логики.
Easy Rider
Это не данные твоей бизнес-логики.
Инфраструктура отнимает больше половины времени и кода. Я не использую cms
Alexander
Инфраструктура отнимает больше половины времени и кода. Я не использую cms
Это странно, но бывает, наверное. У нас она тоже кушает прилично, но тут по другим причинам — у нас кубы.
Alexander
Пока еду в такси подумал о том, что как простое быстрое решение писать запросы в базу норм. Но должна быть задача на рефакторинг, после того, как проект будет запущен. Ничего сложного в этом нет и много времени не займёт. :-)