Tim🌵
Ттл на час
Мне необходимо сохранять сами документы после 1 часа. Я хочу повесить такое ограничение, так как из-за специфики логики индекс нужен только при поиске документов за последний час. А если делать индекс на все документы, то индекс будет слишком огромным
Амир
Индекс на данные за последний час? А потом что происходит с ним? Помоему напрашивается на разделение горячей/холодной части
Tim🌵
Индекс на данные за последний час? А потом что происходит с ним? Помоему напрашивается на разделение горячей/холодной части
У меня был больше вопрос есть ли какие-то встроенные фичи у индекса для моей задачи
Tim🌵
Вариант с двумя коллекциями хороший, да
E1ecti⁠
Привет, можно ли сделать индекс, который хранит только документы добавленные в последний час?
Можно использовать partialFilterExpression, и проверять по условному полю isRecent, которое при создании документов ставить true, и спустя время изменять на false. Самого по себе механизма с ttl индексов нет.
Cloud
ну во-первых ттл индексы в монге есть https://www.mongodb.com/docs/manual/core/index-ttl/ в чем проблема просто добавить индекс по дате создания, и в фильтре искать за последний час? вот прям такой огромный индекс будет?
Vladyslav
Привет, Что можно попробовать чтобы быстрее удалить данные с монго. Имеется коллекция с 15 млн записей. deleteMany(date) - примерно 6 млн записей, индекс по дате есть. Примерно удаляет по 20к в 10мин, что очень слабо. Также пробловал с батчами - разницы не видно.
Vladyslav
как диски себя чувствуют?
к статам доступа нету, через девопсов только, могу запросить Но на всех остальных операциях(создание, апдейт) никаких проблем нету, нагрузка тоже по пару млн записей в час постоянно
Vladyslav
с того что вроде точно знаю, то 3 реплики есть
Nick
просто .deleteMany сразу на бд скриптом, без орм
данные так понимаю удаляются условно старые, тогда только грешить на долгую вычитку с диска и подъем того же холодной части индекса в память. Смотрите в диски, ставьте удаление на ночь когда активности наверняка меньше
Vladyslav
данные так понимаю удаляются условно старые, тогда только грешить на долгую вычитку с диска и подъем того же холодной части индекса в память. Смотрите в диски, ставьте удаление на ночь когда активности наверняка меньше
с такой скоростью 20к\10мин, я уже посчитал что нужно ~50ч, чтобы закончить). Сегодня на нонпрод на ночь поставил, там примерно сколько же удалять - посмотрю завтра ускорилось ли...
Nick
просто .deleteMany сразу на бд скриптом, без орм
покажите какой фильтр указываете на удаление
Vladyslav
покажите какой фильтр указываете на удаление
$lt | .deletemany({"Published": {$lt: ISODate("2025-08-25T10:56:00.000+0000")
Max
просто .deleteMany сразу на бд скриптом, без орм
+ за возможную проблему с диском. Попробуй через drop(раз тебе всё равно надо все удалить) upd понял что не всё раз с фильтром. поле по которому удаляешь в индексе? просто по приколу решил проверить локально сколько это займет (удаляет 16млн записей).
Vladyslav
+ за возможную проблему с диском. Попробуй через drop(раз тебе всё равно надо все удалить) upd понял что не всё раз с фильтром. поле по которому удаляешь в индексе? просто по приколу решил проверить локально сколько это займет (удаляет 16млн записей).
Да, индекс есть. Я ещё в обед погуглил что это распространенная проблема, что это долго по дефолту происходит. С решений выделяли 2 возможные: 1) батчи - в моем случаее без изменений; просто типо вроде нагрузки меньше и не лочишь данные; 2) это через TTL - особо не чекал это, но думаю что тоже не подойдёт
Vladyslav
Кирилл
всем привет может кто помочь объяснить поведение монги. Я сетаплю совершенно новый кластер, хочу собрать секьюрный репликасет. в конфиге прописываю security: keyFile: /opt/mongodb/keyfile у файла права 400 и овнер с группой mongod Также прописываю имя своего репликасета подключаюсь через mongosh (без указания параметров, то есть коннекчюсь просто к localhost:27017), делаю rs.initialize(...) со всеми параметрами своего rs, получаю успех, новый репликасет успешно создан пытаюсь с нуля сделать то же самое, но только подключаюсь через mongosh к mongodb://<master_dns>:27017, где master_dns - днс имя того же самого хоста. подключение происходит, только при выполнении rs.initialize(...) получаю ошибку MongoServerError[Unauthorized]: Command replSetInitiate requires authentication не понимаю, почему при подключении к localhost у меня нет ошибки, а при подключении по днс - есть PS и localhost, и <master-dns> прописаны через запятую в net.bindIp. Более того, ошибка повторяется даже при указании 0.0.0.0 в bindIp. Версия 8.0
Нуриддин
всем привет может кто помочь объяснить поведение монги. Я сетаплю совершенно новый кластер, хочу собрать секьюрный репликасет. в конфиге прописываю security: keyFile: /opt/mongodb/keyfile у файла права 400 и овнер с группой mongod Также прописываю имя своего репликасета подключаюсь через mongosh (без указания параметров, то есть коннекчюсь просто к localhost:27017), делаю rs.initialize(...) со всеми параметрами своего rs, получаю успех, новый репликасет успешно создан пытаюсь с нуля сделать то же самое, но только подключаюсь через mongosh к mongodb://<master_dns>:27017, где master_dns - днс имя того же самого хоста. подключение происходит, только при выполнении rs.initialize(...) получаю ошибку MongoServerError[Unauthorized]: Command replSetInitiate requires authentication не понимаю, почему при подключении к localhost у меня нет ошибки, а при подключении по днс - есть PS и localhost, и <master-dns> прописаны через запятую в net.bindIp. Более того, ошибка повторяется даже при указании 0.0.0.0 в bindIp. Версия 8.0
Два вопроса: 1. У вас есть пользователь с правами входа в кластер и ошибка после входа через него? 2. Получается когда входите в localhost у вас есть статус репликасета? Проверьте db.serverStatus() что там с самой нодой в обоих случаях
Denis
всем привет может кто помочь объяснить поведение монги. Я сетаплю совершенно новый кластер, хочу собрать секьюрный репликасет. в конфиге прописываю security: keyFile: /opt/mongodb/keyfile у файла права 400 и овнер с группой mongod Также прописываю имя своего репликасета подключаюсь через mongosh (без указания параметров, то есть коннекчюсь просто к localhost:27017), делаю rs.initialize(...) со всеми параметрами своего rs, получаю успех, новый репликасет успешно создан пытаюсь с нуля сделать то же самое, но только подключаюсь через mongosh к mongodb://<master_dns>:27017, где master_dns - днс имя того же самого хоста. подключение происходит, только при выполнении rs.initialize(...) получаю ошибку MongoServerError[Unauthorized]: Command replSetInitiate requires authentication не понимаю, почему при подключении к localhost у меня нет ошибки, а при подключении по днс - есть PS и localhost, и <master-dns> прописаны через запятую в net.bindIp. Более того, ошибка повторяется даже при указании 0.0.0.0 в bindIp. Версия 8.0
вроде как после инит есть единственный раз подключения с локальной машины без пароля, как раз для установки пароля db.createUser({user: \"root\", pwd: \""{{ mongo_root_password }}"\", roles: [{role: \"root\", db: \"admin\"}]})
Denis
https://www.mongodb.com/docs/manual/core/localhost-exception/
Denis
https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set-with-keyfile-access-control/#create-the-user-administrator
Denis
Пользователя нет, инстансы только только подняты
ну тогда эксепшн, который разрешает только локально подключаться, выше статьи
Кирилл
Вы не ответили на вопрос 2
Не проверил еще команду, которую вы написали, поэтому не ответил. Проверю, скажу
Denis
Желательно пользователя делать до инит
судя по доке, сначала инициализация, затем пользак
Нуриддин
https://www.mongodb.com/docs/manual/core/localhost-exception/
Прикольно, как-то пропустил это, спасибо
Нуриддин
почему?
Потому что не знал о таком исключении😂
Denis
Vladyslav
@yatoba @lnExtremo да, все упирается в диск. Сейчас 10-11к/сек операций и это почти 100% нагрузки. За 16ч удалило только 2млн записей
Nick
@yatoba @lnExtremo да, все упирается в диск. Сейчас 10-11к/сек операций и это почти 100% нагрузки. За 16ч удалило только 2млн записей
достаточно предсказуемо, теперь бы еще глянуть метрику вытеснения данных из вт кэша (evicted wt cache pages чтото подобное) если она зашкаливает, то памяти уже не хватает под подобные нужды. Но если такое удаление разовое, то можно и потерпеть, но если планируется расти дальше по тем же апдейтам, то стоит задуматься либо более быстрых дисках либо о памяти
Андрій
Привет, есть такой пайплайн: [ { $match: { article: { $in: [ ... ] } } }, { $sort: { _id: -1 } }, { $limit: 20 } ] На поле article есть индекс, но судя по эксплейну, монга использует _id для фильтрации и сортировки. "executionStats": { "executionSuccess": true, "executionTimeMillis": "3774.066", "planningTimeMillis": "0.208", "executionStages": { "stage": "LIMIT_SKIP", "nReturned": "6", "executionTimeMillisEstimate": "3773.817", "inputStage": { "stage": "IXSCAN", "nReturned": "6", "executionTimeMillisEstimate": "3773.809", "indexName": "_id_", "direction": "backward" } } }, Если убрать сортировку, запрос выполняется мгновенно. Без него 10-15 секунд. Есть способ сделать, чтобы монга использовала индексы оптимальней? Знаю, что можно подсказать, какие индексы использовать, но поля могут быть разные, и индексы тоже. Подсказки НЕ использовать индекс _id нет(
Nick
И ещё одно уточнение - у нас не монга а documentDB)
сколько вссего документов в коллекции?
Андрій
Так вроде вы указали сортировать по _id
а почему в первом шаге в match используется также индекс _id, если есть индекс на atricle?
Andrey
Не понятно в чем проблема.
Андрій
Не понятно в чем проблема.
бд применяет не самый оптимальный индекс для match
Андрій
Это все через тупость documentDB. Проверил на монге, она адекватно применяет индексы👍
Max
Это все через тупость documentDB. Проверил на монге, она адекватно применяет индексы👍
Там еще много сюрпризов есть Fyi: https://www.mongodb.com/resources/compare/documentdb-vs-mongodb