Yura
Aggregate блок на поиск нужных документов быстро отрабатывает?
Yura
Проверьте что на нужные ключи есть индексы
Нуриддин
Да я перед этим создаю индекс по 3 ключам группировке
Нуриддин
Сам индекс создаётся 2 часа. Агригация примерно часов 3-4 а удаление тоже примерно столько
Yura
Да я перед этим создаю индекс по 3 ключам группировке
Почему в группировке, у вас же поиск идет как минимум по ключу «type»
Нуриддин
Тоесть мой индекс стоит дополнить на type? спасибо, я попробую
Yura
В первую очередь у вас должны быть индексы на те ключи, по которым выполняется поиск ($match), т.е type и creditRrn
Nick
let creditDeleted = 0; const creditCursor = db.transaction.aggregate([ { $match: { type: "CREDIT", creditRrn: { $ne: null } } }, { $group: { _id: { userGuid: "$userGuid", creditGuid: "$creditGuid", creditRrn: "$creditRrn" }, ids: { $push: "$_id" }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } } ]); creditCursor.forEach(group => { const idsToDelete = group.ids.slice(1); if (idsToDelete.length > 0) { db.transaction.deleteMany({ _id: { $in: idsToDelete } }); creditDeleted += idsToDelete.length; } }); print(`Deleted ${creditDeleted} CREDIT duplicates`);
Про индексы уже сказали. Еще можно собирать все триплеты в батчи например по 10к и уже его большой отправить на удаление в базу. Раз агрегация такая долгая, то стоит результат выгрузить во временную коллекцию чтоб не тратить время
Дмитрий
Привет. MongoDb 7.0.9. Данные периодически удаляются (не нужны в долгосрочной перспективе). Понятно, что место операционной системе не возвращается без компактирования. Скоро закончится свободное место и, если я правильно понимаю, место, которое было использовано ранее данными, будет переиспользовано. И мне ничего с этим делать не нужно. Я прав?
Viktar
Думаю нет. Но я никогда это не тестировал
sixzerx
всем привет есть ли крупные примеры использования mongodb, если необходимы ACID? какие подводные камни и недостатки использования mongo с транзакциями? case: проект с часто меняющейся структурой, но есть крупная логика с фин-операциями
🅰️nimeCoder
уже ознакомился
а что не понятно?
🅰️nimeCoder
в целом можно выстроить так чтобы минимизировать юз транз, что в целом было бы лучше
Nick
всем привет есть ли крупные примеры использования mongodb, если необходимы ACID? какие подводные камни и недостатки использования mongo с транзакциями? case: проект с часто меняющейся структурой, но есть крупная логика с фин-операциями
подводных нет все в доке, читайте внимательно сноски, выбирайте нужные вам опции для обеспечения нужных гарантий и в путь. Ну и главное провести нагрузочное чтоб не удивляться если вдруг производительности не хватит когда юзеры повалят с запросами
sixzerx
нашел классный бенч, ток он к версии 4.0, но не думаю, что что-то сильно поменялось
Кейтлин
нашел классный бенч, ток он к версии 4.0, но не думаю, что что-то сильно поменялось
ну mongodb всегда была специфична к использованию когда строишь архитектуру проекта надо всегда учитывать какая база данных будет выгодна в том или ином ключе а не смотреть на бенчмарки 😄
Кейтлин
когда у тебя меняются мелкие значения то SQL если у тебя меняется раз за разом вся JSON структура то видимо MongoDB 😄
Лешка
Амир
acid
в монге давно асид
Nick
фин операции лучше хранить в SQL
ну "хранить" в "SQL" эт прям ортогональные какието вещи) но если под sql имелись ввиду реляционки, то можно без них прекрасно делать многие вещи, и еще их же можно делать и без транзакций вообще, оставляя на них крайне редкие кейсы, которые к самим фин данным то и не имеют как правило отношения)
Yura
Простейший пример: посмотрите на любой чек банк/фин операции. В нем множество полей в виде ключ:значение и с разным типом данных. Кажется проще всю эту информацию хранить в одном документе монги, а не в отдельных таблицах реляционки и выполнять поиск с джоинами.
Владимир
Простейший пример: посмотрите на любой чек банк/фин операции. В нем множество полей в виде ключ:значение и с разным типом данных. Кажется проще всю эту информацию хранить в одном документе монги, а не в отдельных таблицах реляционки и выполнять поиск с джоинами.
Всё верно, но * если большое приложение - описывать это на языке со строгой типизацией и сразу возникает ситуация, что надо данные как-то размечать и структурировать * в Postgres есть JSONB
Старый
Простейший пример: посмотрите на любой чек банк/фин операции. В нем множество полей в виде ключ:значение и с разным типом данных. Кажется проще всю эту информацию хранить в одном документе монги, а не в отдельных таблицах реляционки и выполнять поиск с джоинами.
наши банки это отдельный вид стёба и бреда, там вместо номральных бд шардируют пг на 300 шардов. о чём речь?там до сих пор даже логи часто пишут транзакциями просто потому что так когда то было принято
Старый
Всё верно, но * если большое приложение - описывать это на языке со строгой типизацией и сразу возникает ситуация, что надо данные как-то размечать и структурировать * в Postgres есть JSONB
postres хорошая база для проектов с 100-300 гб. всё что больше 2 тб уже сложности на уровне внедрения tidb/ydb/yugabyte, и вечные проблемы
🅰️nimeCoder
2тб MySQL Вроде проблем нет
🅰️nimeCoder
Ну 1.5ТБ мб
Andrey
2тб MySQL Вроде проблем нет
"все сложности начинаются после 2+ млрд записей "(с) опытным путем
Старый
2тб MySQL Вроде проблем нет
mysql бывает разным. с myrocks стораджем 2 тб уже давно не продел, да и если мы говорим про галера кластер. то он просто в разы лучше чем всё что есть в пг
sixzerx
мне кажется любую базу можно подложить под любой проект, дело только в том, куда это потом выльется не нашел ни одного глобал юз кейса использования монги в финоп бояться может, я бы тоже очковал по результатам бенча выше ну ок, не вывозит -> маштабируемся, только один хуй один инстанс той же постгры с бэком на фулл транзакциях и сильной изоляцией будет работать как несколько инстансов монги
Ιβαν
всем привет. Настраиваю pbm для нешардированной монги (реплика-сет из 3 нод). При попытке выполнить pbm status или pbm config выдает сообщение Error: connect to mongodb: get config server connection URI: mongo: no documents in result . URI в переменной окружения задан так: PBM_MONGODB_URI="mongodb://pbmuser:pass@localhost:27017/?authSource=admin&replicaSet=rs0"в mongosh с этим URI pbmuser успешно заходит. Сам pbmuser имеет следущие роли: user: 'pbmuser', db: 'admin', roles: [ { role: 'clusterMonitor', db: 'admin' }, { role: 'backup', db: 'admin' }, { role: 'restore', db: 'admin' }, { role: 'pbmAnyAction', db: 'admin' }, { role: 'readWrite', db: 'admin' } ], Кто-то сталкивался? Для шардированных кластеров такие же настройки ожидаемо работают. Ощущение, что пбм считает мой реплика сет шардированной монгой и пытается запросить ее Версия монги 7.0.12, версия PBM 2.9.1
Нуриддин
Сори, дизинфа
Yura
всем привет. Настраиваю pbm для нешардированной монги (реплика-сет из 3 нод). При попытке выполнить pbm status или pbm config выдает сообщение Error: connect to mongodb: get config server connection URI: mongo: no documents in result . URI в переменной окружения задан так: PBM_MONGODB_URI="mongodb://pbmuser:pass@localhost:27017/?authSource=admin&replicaSet=rs0"в mongosh с этим URI pbmuser успешно заходит. Сам pbmuser имеет следущие роли: user: 'pbmuser', db: 'admin', roles: [ { role: 'clusterMonitor', db: 'admin' }, { role: 'backup', db: 'admin' }, { role: 'restore', db: 'admin' }, { role: 'pbmAnyAction', db: 'admin' }, { role: 'readWrite', db: 'admin' } ], Кто-то сталкивался? Для шардированных кластеров такие же настройки ожидаемо работают. Ощущение, что пбм считает мой реплика сет шардированной монгой и пытается запросить ее Версия монги 7.0.12, версия PBM 2.9.1
export переменной PBM_MONGODB_URI перед запуском агента PBM делали?
Yura
Если конфиг pbm настраивали в pbm_config.yaml, то запускать нужно соответственно, например: pbm config --file /etc/pbm_config.yaml
Yura
затем только запуск самого pbm-agent
Ιβαν
export переменной PBM_MONGODB_URI перед запуском агента PBM делали?
да, настраивал. При вызове pbm status или pbm config успешно аунтифицируется в базе юзер (видно в логе) . Так же успешно проходит соединение, если вызвать mongosh $PBM_MONGODB_URI Current Mongosh Log ID: 6891fc12dece6a9f8ce3e840 Connecting to: mongodb://<credentials>@<host>:27017/admin?replicaSet=rs0&appName=mongosh+2.5.1 Using MongoDB: 7.0.12-7 Using Mongosh: 2.5.1 rs0 [primary] admin>
Tim🌵
Всем привет, могу ли я настроить шардинг только на одной машине? По определенным причинам я пока не могу выносить БД за пределы одной машины, а коллекция стала очень большой (более миллиарда записей). Поэтому ищу любые способы оптимизировать запросы, буду благодарен советам 🙏
Ιβαν
Если конфиг pbm настраивали в pbm_config.yaml, то запускать нужно соответственно, например: pbm config --file /etc/pbm_config.yaml
при любов вызове утилиты pbm ответ одинаковый : # pbm config --file ~/config.yml Error: connect to mongodb: get config server connection URI: mongo: no documents in result
Ιβαν
затем только запуск самого pbm-agent
до пбм агента сначала добраться надо, сперва настроить конфиг бы
Ιβαν
а что в конфиге?
без разницы, хоть с3 хранилище, хоть локальное. Можно даже несуществующий файл ему дать на вход - он просто не обращается в файл, потому что заканчивает выполнение раньше. Утилита обращается в монгу, не получает откуда-то ожидаемых документов и прекращает выполнение # ls ~/foo.yml ls: cannot access '/root/foo.yml': No such file or directory # pbm config --file ~/foo.yml Error: connect to mongodb: get config server connection URI: mongo: no documents in result
Yura
Всем привет, могу ли я настроить шардинг только на одной машине? По определенным причинам я пока не могу выносить БД за пределы одной машины, а коллекция стала очень большой (более миллиарда записей). Поэтому ищу любые способы оптимизировать запросы, буду благодарен советам 🙏
Да оно то можно, но по факту весь ваш миллиард будет крутиться всё равно на одной машине и потреблять её ресурсы. Только вместо, например, одного сервиса mongod туда ещё добавятся сервисы mongod шардов, конфиг сервера и mongos. Отказоустойчивым решением это не назвать вообще. Если вам нужна оптимизация запросов из-за того что вы уперлись в ресурсы сервера - то шардинг не выход в вашем случае, а если нужно оптимизировать сами запросы - то начните с них.
Yura
Что в конфиге самой монги?
Ιβαν
Что в конфиге самой монги?
а что конкретно интересует? Нешардированная монга, реплика сет из трех нод
yopp
Даже при свежей раскатке PBM, когда в БД admin ещё нет коллекций относящихся к перконе, он не должен выдавать ошибку подключения
no documents in collection это не ошибка подключения, это ошибка чтения конфигурации бэкапов pbm config это просто обёртка вокруг чтения admin.pbmConfig https://github.com/percona/percona-backup-mongodb/blob/dev/pbm/config/config.go#L485
Ιβαν
Параметры шардирования там точно отключены?
черт, вы оказались правы, в конфиг из автоматизации заехал параметр шардирования
Ιβαν
спасибо
Yura
Только после выполнения команды: pbm config --file ~/pbm_config.yaml если всё корректно и вам отобразится его содержимое, тогда в БД admin появятся коллекции: pbmCmd pbmConfig
Cloud
{"t":{"$date":"2025-08-05T03:23:16.952+03:00"},"s":"I", "c":"REPL", "id":3873113, "ctx":"ReplCoordExtern-2","msg":"Cannot select sync source which is not ahead of me","attr":{"syncSourceCandidate":"rnd-eu-d b3.foo.com:27017","syncSourceCandidateLastAppliedOpTime":{"ts":{"$timestamp":{"t":1754353395,"i":25}},"t":4},"lastOpTimeFetched":{"ts":{"$timestamp":{"t":1754353396,"i":10}},"t":4}}} {"t":{"$date":"2025-08-05T03:23:17.962+03:00"},"s":"I", "c":"REPL", "id":3873113, "ctx":"ReplCoordExtern-2","msg":"Cannot select sync source which is not ahead of me","attr":{"syncSourceCandidate":"rnd-eu-d b3.foo.com:27017","syncSourceCandidateLastAppliedOpTime":{"ts":{"$timestamp":{"t":1754353395,"i":25}},"t":4},"lastOpTimeFetched":{"ts":{"$timestamp":{"t":1754353397,"i":18}},"t":4}}} {"t":{"$date":"2025-08-05T03:23:18.942+03:00"},"s":"E", "c":"ASSERT", "id":23077, "ctx":"ftdc","msg":"Assertion","attr":{"error":"BSONObjectTooLarge: BSONObj size: 22162576 (0x1522C90) is invalid. Size must be between 0 and 16793600(16MB) First element: start: new Date(1754353398000)","file":"src/mongo/bson/bsonobj.cpp","line":129}} "ctx":"ftdc","msg":"Assertion","attr":{"error":"BSONObjectTooLarge ключевой момент кто-то сталкивался с подобным? в гугле ток 1 страница про это, все что предлагают повысить уровень логироавния нужен вообще этот ftdc или мб его вырубить нафиг? что можно сделать?
Yura
{"t":{"$date":"2025-08-05T03:23:16.952+03:00"},"s":"I", "c":"REPL", "id":3873113, "ctx":"ReplCoordExtern-2","msg":"Cannot select sync source which is not ahead of me","attr":{"syncSourceCandidate":"rnd-eu-d b3.foo.com:27017","syncSourceCandidateLastAppliedOpTime":{"ts":{"$timestamp":{"t":1754353395,"i":25}},"t":4},"lastOpTimeFetched":{"ts":{"$timestamp":{"t":1754353396,"i":10}},"t":4}}} {"t":{"$date":"2025-08-05T03:23:17.962+03:00"},"s":"I", "c":"REPL", "id":3873113, "ctx":"ReplCoordExtern-2","msg":"Cannot select sync source which is not ahead of me","attr":{"syncSourceCandidate":"rnd-eu-d b3.foo.com:27017","syncSourceCandidateLastAppliedOpTime":{"ts":{"$timestamp":{"t":1754353395,"i":25}},"t":4},"lastOpTimeFetched":{"ts":{"$timestamp":{"t":1754353397,"i":18}},"t":4}}} {"t":{"$date":"2025-08-05T03:23:18.942+03:00"},"s":"E", "c":"ASSERT", "id":23077, "ctx":"ftdc","msg":"Assertion","attr":{"error":"BSONObjectTooLarge: BSONObj size: 22162576 (0x1522C90) is invalid. Size must be between 0 and 16793600(16MB) First element: start: new Date(1754353398000)","file":"src/mongo/bson/bsonobj.cpp","line":129}} "ctx":"ftdc","msg":"Assertion","attr":{"error":"BSONObjectTooLarge ключевой момент кто-то сталкивался с подобным? в гугле ток 1 страница про это, все что предлагают повысить уровень логироавния нужен вообще этот ftdc или мб его вырубить нафиг? что можно сделать?
Вот ваша ошибка: Size must be between 0 and 16793600(16MB) https://www.mongodb.com/docs/manual/reference/limits/#mongodb-limit-BSON-Document-Size
Cloud
ftdc - Full Time Diagnostic Data Capture, то есть система постоянного сбора диагностических данных о состоянии сервера MongoDB
Андрій
Привет, есть коллекция с документами такого вида: { "_id": ..., "characteristics":{ "foo": { "name_id": ObjectId(), "value_id": ObjectId(), }, "bar": ..., "baz": ... } } и бывают фильтр запросы по типу {$match: {"characteristics.foo.value_id": ObjectId()}} Записей полтора миллиона, без индекса такая фильтрация происходит несколько десятков секунд. Таких характеристик у обьектов много, поэтому вешать индекс на все не выглядит целесообразным решением. Есть ли какие то варианты, как можно ускорить поиск малыми жертвами?
Андрій
гнать в эластик
если бы... Не дадут денег(
Амир
поиск по всем измерениям херня конечно, а много это сколько?
Андрій
поиск по всем измерениям херня конечно, а много это сколько?
Примерно пару десятков. Решили выделить в итоге самые искомые поля и на них поставить индекс
xzcxzczx
привет ребят вопрос! у меня есть каталог товаров и сами товары к товарам что лучше сделать Link чтобы был dbref? или просто ObjectID на айдишник каталога?
Tim🌵
Привет, можно ли сделать индекс, который хранит только документы добавленные в последний час?