yopp
в любом хранилище можно создать условия при которых можно «потреять» данные
Артем
Главное правильно обрабатывать ошибки (сетевые например), которые могут возникать в транзакции. Но это логика приложения, монга тут уже не причем
Roman
Ну например мне надо поменять 3 документа и 2 поменяло а на последнем ошибка возникла. Монга сделает рол бэк в этом случае? Или данные бытые останутся?
yopp
без транзакции — нет
Сергей
Добрый вечер подскажите пожалуйста как увидеть пользователей
yopp
https://docs.mongodb.com/manual/core/transactions/ https://docs.mongodb.com/manual/core/write-operations-atomicity/
yopp
транзакции нужны только в случае, когда у вас есть зависимые обновления
yopp
по этому транзакции необходимо явно использовать
Roman
Нужно давать какието инструкции драйверу?
Артем
Ну в pymongo например при чтении/записи указывается дополнительный параметр session, в который передается объект, представляющий из себя сессию с запущенной транзакцией
Артем
Там еще важный момент, что если вы хотите использовать транзакции, то лучше обновиться до mongodb 4.2+, поскольку в предыдущих версиях стоит ограничение на 16mb по размеру изменений, которое можно сделать в одной транзакции
yopp
Нужно давать какието инструкции драйверу?
Откройте ссылки выше, там хорошие туториалы для множества языков
yopp
Это последнее предупреждение
Roman
Это последнее предупреждение
~за 2недели или 1 месяц перенести слой доступа к данным
yopp
и за месяц тоже
Roman
@dd_bb еще хотел спросить. Не было ли на практике проблем с транзакциями междокументыми
yopp
Зависит от задач. В монге нет управления блокировками и все конфликты в случае конкурентного обновления документов разрешаются через единственный commit с последующим abort всех остальных конфликтующий транзакций. При специфических нагрузках это может вызывать нежелательные эффекты. Плюс необходимо понимать гарантии durability которые даёт монга и в каких случаях они работают
Daniyar
ребята, в схеме есть какое-то поле, который был уникальным.. но потом удалил unique: true; и все равно если создаю новый док то он кидает ошибку duplicate key (хотя он уже не уникальный).. в чем может быть проблема?
Roman
Зависит от задач. В монге нет управления блокировками и все конфликты в случае конкурентного обновления документов разрешаются через единственный commit с последующим abort всех остальных конфликтующий транзакций. При специфических нагрузках это может вызывать нежелательные эффекты. Плюс необходимо понимать гарантии durability которые даёт монга и в каких случаях они работают
Проэкт не хайлоад. Достаточно мне сделать транзакционный контекст и передавать сессию чтобы обновить несколько документов за 1 запрос с возвратом состояния после возможного ролбэка к предыдущему состоянию документа? Чтобы предотвратить ситуацию с битыми данными
Arthur
он нужен когда вы ищите не полное совпадение
Подскажите, почему... User.update( {}, { $pull: { cards: { $elemMatch: { refId: crdRefId } } } }, { multi: true }, function (err, doc) { if (err) throw err; console.log(doc) }); ...делает cards пустым массивом
Daniyar
скорее всего у вас остался индекс с uniq constraind в этой коллекции
как это можно убрать? или только очистив коллекцию?
yopp
Подскажите, почему... User.update( {}, { $pull: { cards: { $elemMatch: { refId: crdRefId } } } }, { multi: true }, function (err, doc) { if (err) throw err; console.log(doc) }); ...делает cards пустым массивом
Если совпадений нет, то ничего происходить не должно. Если у вас cards это аттрибут с массивом документов в корне, то действительно $elemMatch не нужен: https://play.db-ai.co/m/XvILfH7kZQABtDhf
Anton
Добрый день! Подскажите, пожалуйста, столкнулся с проблемой: на удаленном сервере выполнение запроса к базе занимает 10-20 секунд, база при этом находится в докере локально запрос выполняется мгновенно, при этом набор данных в базах совершенно одинаковый куда стоит копнуть?
Anton
нет, потому что раз локально очень быстро отрабатывает, я решил, что дело не в запросе, а в окружении, настройках или чем-то еще
Anton
да, создаются при запуске прилы, так что не перепутать)
Roman
Какие гарантии durability которые даёт монга и в каких случаях они работают?
Leonid
Делайте explain и смотрите где у вас задержка. У меня была бага, что удаленный сервер имел версию на минор ниже и криво отрабатывал сортировку по индексу. Обновление помогло
Leonid
а не подскажете, с какими версиями была проблема?
не помню, вроде 4.1.8, апнулись до 4.1.12 - заработало корректно
yopp
4.1 это development branch
Leonid
интересно. я не знал
Leonid
4.0 8 -> 4.0.12
Roman
Привет! Есть коллекция с документами вида { "atr":"val", "array":[ {"child_atr":"chaild_val_1", "some":"some"}, {"child_atr":"chaild_val_2", "some":"some"} ] } Необходимо выполнить update документа. На вход атрибуты для дочерних атрибутов массива. Таким образом, что необходимо или обновить дочерний элемент если найден по входящим параметрам, или добавить новый. Есть ли какой-то секрет как совместить одновременно $push если arrayFilters не вернул индекс дочернего, и $set если arrayFilters нашел элемент в массиве?
Paul
Ребят вопрос: в каком случае стоит выбрать монго вместо майсиквел? И есть ли разница в сокрости или в чем ещё?
Nick
Ребят вопрос: в каком случае стоит выбрать монго вместо майсиквел? И есть ли разница в сокрости или в чем ещё?
Похоже пора гдето делать подборку ответов на такие вопросы. Сначала вы делаете анализ вашей задачи/проекта, выписваете критерии для БД, потом смотрите как каждая база поддерживает ваши требования, сложно/просто что выполнить из ваших хотелок. Расставляете баллы, суммируете, выбираете. Нанимаете людей со знаниями выбранной бд или учите сами. Через полгода запуска проекта делаете переоценку и решаете оставаться на выбранной бд или нет.
Paul
А в общем для каких проектов берут монго обычно?
Nick
А в общем для каких проектов берут монго обычно?
Под любые, с появлением тразакций уже нет потребности менять мышление, чтобы решить проблему консистености без них
Nick
Ну развн что если у вас лютая многомерная с кучей условий аналитика планируется на достатчно больших данных и при этом будут требовпния на время выполнения - в этом случае лучше монгу не брать)
Nick
Обозреватель блоков типо etherscan.io
Это не отменяет сбора требований и анализа
yopp
https://play.db-ai.co научился работать с ключами без кавычек
Semeon
Для $bucket надо использовать $match? Или его заменяет groupBy?
Богдан
Подскажите, пожалуйста, работает ли кто тут на джаве? Есть вопросы почему одна часть кода работает, а вторая, идентичная нет))))))))))
Богдан
работает
Богдан
не работает
Богдан
код находится в одном месте
Захар
работает
предлагаю избавиться от жавы
Захар
Надо
а как же котлин
Богдан
кажется matcher.find() мутирует стэйт объекта
Нет, выше строки втором скрине есть такая же строка, но с find(), он возвращает true/false и все
Богдан
Никто не может подсказать, почему так?)
Богдан
Нашел полуответ Если сопоставитель еще не выполнял поиска или предыдущая операция поиска завершилась неудачей, генерируется исключение IllegalStateException. Однако сопоставитель искал уже поиск😤
Nick
Нет, выше строки втором скрине есть такая же строка, но с find(), он возвращает true/false и все
А ответ выше вам вообщето дали - чтобы использовать group нужно вызывать find
Богдан
А ответ выше вам вообщето дали - чтобы использовать group нужно вызывать find
Да, я уже нашел ответ Только он не мутирует, а запускает цепочку событий, при которых находит подстроки, когда без него match находит лишь полное совпадение Как-то глупо работает🥴
Nick
Да, я уже нашел ответ Только он не мутирует, а запускает цепочку событий, при которых находит подстроки, когда без него match находит лишь полное совпадение Как-то глупо работает🥴
Это связано с необходимость проходить по разным группам в регулярках, вплоть до итеративного применения самой регулярки циклично по всему тексту. И это можно делать на здоровенных объемах не бояться что первый вызов будет ждать полного анализа данных, а обходить итеративно по кускам
Nick
Без него матчер работает как попытка проверить на соответствие регулярке всего текста с помощью метода match(), а не какойто его части
Богдан
И зачем мне создавать отдельный объект паттерна, ещё и вызывать метод компилирования строки regex?
Nick
Это уже оффтоп и лучше переместиться в жвм чат
Богдан
Без него матчер работает как попытка проверить на соответствие регулярке всего текста с помощью метода match(), а не какойто его части
Получается matches -> find() ? ifTrue -> group(): ifFalse Почему нельзя было matchesAll, а там, если есть результаты/если их нет? Это последний вопрос (касательно оффтопа) по этой штуке)
Nick
Тут я уже могу плавать
Богдан
Да, причем вроде как group(0) - нулевой содержит подходящую строку
Но только после всех операций, что мы сделали А ведь могли бы сразу. В ноде же так происходит
Богдан
Ну да ладно Ответ найден, спасибо всем за участие и ответы) Хорошего вечера и чистого кода)
Nick
Но только после всех операций, что мы сделали А ведь могли бы сразу. В ноде же так происходит
Ну запихните в ноду гиговый файл xml и регуляркой поищите в нем структуру из подряд идущих тегов