Ростислав ✚
диски у вас какие на серваке и какой объем бд?
Сейчас не пускает в панель управления, но записей сейчас 900+к, вес где-то 35гб, диски nvme если правильно помню
Nick
Сейчас не пускает в панель управления, но записей сейчас 900+к, вес где-то 35гб, диски nvme если правильно помню
начните с того что $project переставьте после лимита, т.к. в нем есть $filter. Судя по коду у вас абсолютно всегда указывается спорт для выборки, тогда стоит просто сделать составной индекс sport-startTime Опционально попробуйте сортировку на первое место поставить до матча, хотя это скорее всего приведет к колсканам, но лучше проверить опять же эксплейном
Алексей
я бы тоже попробовал составной индекс спорт: 1, стартТайм: -1
Nick
Хорошо, спасибо, попробую переставить и сделать составной индекс
делайте поэтапно чтобы проверять что именно и какой дает результат
yopp
Всем привет, сортировка сильно увеличивает время ответа от монго, как это можно оптимизировать? Без нее 1,5с а с ней 15-20 Скрин1 - pipeline Скрин2 - пример документа
Вам нужен составной индекс в котором префиксом являются поля по которым вы фильтруете документы а суффиксом является поле по которому идёт сортировка отфильтрованных документов Если составного индекса нет то сортировка будет в памяти. А это сначала надо прочитать с диска/из кеша в буфер все попавшие под условия документы, а потом уже в этом буфере их все сортировать. Это очень медленно. У вас фильтр состоит из sport, leagueGroup и isFinished, а сортировка по startTime: -1 Тогда ваш запрос покроет вот такой индекс: {sport: 1/-1, leagueGroup: -1/1, isFinished: 1/-1, startTime: -1} Порядок сортировки ключей в индексе для первых трёх полей может быть любым, если вы по этим полям дополнительно не планируете сортировать, а вот поле startTime должно иметь тот-же порядок что и в $sort. В целом планировщик запросов почти никогда не использует пересечение нескольких индексов для фильтрации и если правильно помню, вообще никогда не использует пересечение для сортировки. Поэтому создавать много одиночных индексов по разным полям не имеет смысла, если вы не фильтруете с условием где есть только одно условие по конкретному полю.
Andrey
Вечер добрый. поставил mondodb 7.0, и пытаюсь выключить доступ с локалхоста без пароля. Пользователя создал, в конфиге написал: security:   authorization: "enabled" setParameter:    enableLocalhostAuthBypass: false а mongosh ходит и ничего не спрашивает если явно задать логин-пароль "mongosh --port 27017 -u admin -p '12345' --authenticationDatabase 'admin" тоже пускает
Ростислав ✚
Вам нужен составной индекс в котором префиксом являются поля по которым вы фильтруете документы а суффиксом является поле по которому идёт сортировка отфильтрованных документов Если составного индекса нет то сортировка будет в памяти. А это сначала надо прочитать с диска/из кеша в буфер все попавшие под условия документы, а потом уже в этом буфере их все сортировать. Это очень медленно. У вас фильтр состоит из sport, leagueGroup и isFinished, а сортировка по startTime: -1 Тогда ваш запрос покроет вот такой индекс: {sport: 1/-1, leagueGroup: -1/1, isFinished: 1/-1, startTime: -1} Порядок сортировки ключей в индексе для первых трёх полей может быть любым, если вы по этим полям дополнительно не планируете сортировать, а вот поле startTime должно иметь тот-же порядок что и в $sort. В целом планировщик запросов почти никогда не использует пересечение нескольких индексов для фильтрации и если правильно помню, вообще никогда не использует пересечение для сортировки. Поэтому создавать много одиночных индексов по разным полям не имеет смысла, если вы не фильтруете с условием где есть только одно условие по конкретному полю.
Я так и сделал, составил спорт и старттайм и теперь все отлично, спасибо
Hunter
Я зробив дамп БД, можна його локально стартанути задоплмогою docker і якщо да, то ще силочку як це зробити?)
Hunter
Я зробив дамп БД, можна його локально стартанути задоплмогою docker і якщо да, то ще силочку як це зробити?)
Я сделал дамп БД, можно его локально запустить с помощью docker и если возможно, то пожалуйста киньте ссылку как это сделать?
Алексей
Localhost Exception You can create users either before or after enabling access control. If you enable access control before creating any user, MongoDB provides a localhost exception which allows you to create a user administrator in the admin database. Once created, you must authenticate as the user administrator to create additional users.
Алексей
To disable the localhost exception, set the enableLocalhostAuthBypass parameter to 0.
Andrey
всем привет,почему у меня переменную не получается сделать ObjectId?,Прикол в том что если передать значение из переменной напрямую,то есть саму строку, то все ок
Артемий
Доброго дня Подскажите пожалуйста Использую составной индекс, к примеру из 5 полей, но при выборке, какие-то поля могут отсутствовать (1-е всегда будет, остальные 4 по ситуации, порядок полей в запросе известен) Прочитал много инфы, но так к верному решению и не пришел... При выборке главное наличие 1-го поля, что бы индекс использовался (он у меня как раз всегда есть), а дальше, если отсутствует к примеру 3-е поле, то индекс так же будет использоваться? Просто выборка будет последовательно по 1, 2, 4 и 5 полю, без 3-го, либо только по 1 и 2, а поскольку 3-го нет, то и до 4-5 не дойдет?
Артемий
Или же требуется написать все возможные вариации индексов поле1,поле2, поле3, поле4, поле5 поле1, поле3, поле4, поле5 поле1,поле2, поле4, поле5 поле1,поле2, поле3, поле5 поле1,поле2, поле3, поле5 и т.д, со всеми вариациями либо же вот этого будет достаточно поле1(имеется всегда),поле2, поле3, поле4, поле5
Алексей
вариации индексов?)) память то не резиновая и дело не только в ней, на 1 вставку будут персчитываться ВСЕ индексы что замедлит твою коллекцию с пачкой индексов
Артемий
составной поможет только при порядке тех полей что в нем, то есть для индекса a:1 b:1 c:1 d:1 будет ускорен только поиск: - a - a, b - a, b, c - a , b, c, d порядок важен, запрос типа find({b: 1, a:2}) не будет ускорен
т.е. если индекс a:1 b:1 c:1 d:1 а запрос у меня find({a: 1, c:2, d:1}) (без b), индекс не будет нормально отрабатывать и для такого запроса потребуется индекс типа a:1 c:1 d:1
Артемий
вариации индексов?)) память то не резиновая и дело не только в ней, на 1 вставку будут персчитываться ВСЕ индексы что замедлит твою коллекцию с пачкой индексов
есть такое но как тогда правильно использовать индексы в моем случае где 5 полей, 1-е всегда используется при выборке, а остальные 4 могут быть, а могут и нет
Алексей
надо именно собрать всю стату какие реально запросы могут быть, какие важны, какие пусть себя тянутся, что надо точно ускорить и на основании этого индексы продумать. Может половина твоих вариантов по факту раз в год случается?
Артемий
надо именно собрать всю стату какие реально запросы могут быть, какие важны, какие пусть себя тянутся, что надо точно ускорить и на основании этого индексы продумать. Может половина твоих вариантов по факту раз в год случается?
понял, т.е. резюмируя еще раз на каждый конкретный запрос правильно создавать индекс с конкретным набором полей, но беребарщивать не следует, только самые мастхев запросы
Алексей
да, сначала проанализируй, потом когда ты знаешь что вот львиная доля это такие запросы -смотри. Индекс на первое поле точно не помешает раз оно везде
Артемий
благодарсвтую
Nick
составной поможет только при порядке тех полей что в нем, то есть для индекса a:1 b:1 c:1 d:1 будет ускорен только поиск: - a - a, b - a, b, c - a , b, c, d порядок важен, запрос типа find({b: 1, a:2}) не будет ускорен
порядок появления ключей в запросе не имеет значения, даже хз откуда эта информация у вас. А вот порядок ключей сортировки как раз влияет на факт участия индекса
Nick
т.е. если индекс a:1 b:1 c:1 d:1 а запрос у меня find({a: 1, c:2, d:1}) (без b), индекс не будет нормально отрабатывать и для такого запроса потребуется индекс типа a:1 c:1 d:1
скорее всего будет быстрее чем без индекса. Так же можно немного хитрить и в услвоие выборки указывать явно поле b но указывать ему для значения границы через $gt/$lt таким образом подталкивая планировщик использовать конкретный индекс индекс из этих четырех полей
Артемий
Nick
интересная хитрость но немного не понял с реализацией т.е. если какое-то поле отсутствует, мы все равно дописываем его в запрос, но без конкретного значения, но это как сделать
db.getCollection('t_1').find({ a: 1, b: {$gte: MinKey}, b: {$lte: MaxKey}, c: 3 }).explain() хотя по идее достаточно либо мин либо макс, т.к. полностью покрывает Сейчас поигравшись кажется что всетаки это не очень идея и требует проверки на большом объеме данных а не на паре доков как у меня. Так что считайте рекомендацию сомнительной)
Артемий
а как насчет такой идеи - не создавать кучу индексов, а создавать индекс непосредственно перед выполнением запрос, т.к. я знаю какие поля потребуются, и соотв. после выполнения запроса удалять индекс... или похоже на маразм больше?)
Nick
Не всегда это хорошая идея. Если большой объём выборки, то работает медленнее.
вот и я об этом подумал, что форсировать индекс может быть плохой идеей и планировщику виднее
Nick
а как насчет такой идеи - не создавать кучу индексов, а создавать индекс непосредственно перед выполнением запрос, т.к. я знаю какие поля потребуются, и соотв. после выполнения запроса удалять индекс... или похоже на маразм больше?)
создание индекса очень дорогое как по ресурсам так и по времени. Создавать стоит когда время запроса не устраивает по объективным причинам, т.е. выполнение запроса 10 секунд может быть вполне нормально если формируется отчет и никто не ждет что это будет за доли секунды, а вызывают раз в неделю - в таком случае индексы будут только пассивно жрать память и замедлять вставки
Mr.
Здравствуйте Прошу вашей помощи. Установил mongoDB 7.0 через brew, MacOS Ventura. Делал все по инструкции на сайте морги Возникает ошибка при запуске Mongosh Как это можно решить?
Mr.
Алексей
ты ее не удалял, не переставлял? посмотри лог, возможно там неверный путь к бд написан
Алексей
у меня так было после неудачной переустановки
Mr.
ты ее не удалял, не переставлял? посмотри лог, возможно там неверный путь к бд написан
Изаначально не удалял, просто обновил. Появилась ошибка - потом удалил все( может что то упустил ) Команду brew services start mongodb-community@7.0 использовал. Все равно не работает
Алексей
значит удалил не все) надо сносить подчистую с папками и настройками и потом заново ставить
Mr.
Удалял как сказано тут
Mr.
https://www.mongodb.com/basics/uninstall-mongodb
Алексей
да, я также но еще глазками по брю прошел каталогам и снес все что с монго было типа логов, репликасетов и прочего
Алексей
тогда заработало
Алексей
но в логи то глянь чего там
Mr.
но в логи то глянь чего там
Перерыл все по названию и переудалял Спасибо большое, все работает
Artem
привет. подскажите пж, что не так в агрегации делаю ? на первом шаге ошибка (на скрине), документы есть в коллекции. дата хранится в строке в ИСО формате, но не находит их
Artem
в базе лежит реквизит в формате строки
Исмаил
Всем привет, такая ситуация,впервые задеплоил проект на нест в связке с монго, сервер не работаетв логах показівает єто - *ERROR [MongooseModule] Unable to connect to the database.* Обычно получал такую ошибку когда нужно было добавлять ip на сайте монгодб. Как решить эту проблему ?
Исмаил
проверить что адрес корректный, что есть сетевой доступ с сервака где пытаетесь запустить, например через тот же mongosh
адрес MONGO_URI который тут ? MongooseModule.forRootAsync({ imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ uri: configService.get<string>('MONGODB_URI'), dbName: configService.get<string>('MONGO_DB_NAME'), }), если да то он верный, а насчет сетевого доступа не понял, как это проверить ?
Исмаил
просто локально при запуске он работает, после деплоя не работает, как то может нужно на heroku добавлять ip адрес?
Nick
string
странно, проверил только что если и там и там строки, то все корректно работает. Проверяйте типы
Artem
странно, проверил только что если и там и там строки, то все корректно работает. Проверяйте типы
могло ли быть связано с тем, что раньше в базе был у поля тип Дата, но после этого в схеме монгуса поменял на строку. Он в базе существующие доки по типам не переделывал, выходит ?
Nick
могло ли быть связано с тем, что раньше в базе был у поля тип Дата, но после этого в схеме монгуса поменял на строку. Он в базе существующие доки по типам не переделывал, выходит ?
само по себе не перекладывает. Нужно явно делать апдейты. Но мне интересно почему решили отказатсья от удобного для работы встроенного типа в пользу неудобных строк?
Artem
если честно не подскажу конкретно, помню только что была однажды давно проблема из-за типа даты, а точнее ее несовместимости где-то, и пришлось писать конвертацию из Даты в ИСОстроку, после чего один опытный ЖСер, сказал, что хранить в ИСОСтроке - правильнее, и даже аргументы вроде были, но я не вспомню) просто взял на заметку с того времени
Artem
а за ответ спасибо ! надеюсь и правда в этом дело)
Исмаил
да он, подключитесь через mongosh используя его
смог решить проблему добавлением в атласе айпи адреса 0.0.0.0/0 так вообще нормально делать ? или это костыль.
Maxmudjon
Нужно помощь есть два компания, в каждом хранится profile сотрудника, fooCompanyDBConnection collection.staffers barCompanyDBConnection collection.staffers но бд`user` хранится отдельно в другом месте UserDB collection.users как написать схема в монгусе чтобы было универсально в будущем чтобы не писат fooCompanyDBConnection или barCompanyDBConnection?
Maxmudjon
мне очень хочется отдельно БД хранит каждый компания но логин пароль сотрудника хранит в едином месте в отдельный БД
The dark fight
Net
Лиза
Замок стоял забытым временем
of Astora 𒉭
Замок стоял забытым временем
и вокруг него царила атмосфера таинственности и загадочности
привет всем, как исправить эту ошибку ?
Алексей
не тратить всю память
π∆$#∆
Привет, подскажите пожалуйста, делаю задание, никак не проходят тесты. Все, что пробовал, не работает. Думаю db.Wines.find( { id: { $regex: '23$'} } ).pretty() должно работать, но нет. Upd: исправил ссылку
Doни
qq all Чеза ошибка я бы хотел коннектид монгодб
of Astora 𒉭
qq all Чеза ошибка я бы хотел коннектид монгодб
​    ​mongoose​.​connect​(​process​.​env​.​MONGO_URI​,​ ​{​useNewUrlParser​: ​true​,​ ​useUnifiedTopology​: ​true​}​) ​    ​.​then​(​(​)​ ​=>​ ​console​.​log​(​'MongoDB connected!'​)​) ​    ​.​catch​(​(​error​)​ ​=>​ ​console​.​log​(​error​)​) попробуй так
of Astora 𒉭
Тоже самое ошибка вводит
попробуй убрать usenewUrlParser