Сотрудник 236
укажи w: majority, j: false
Назар
локально макбук про м1 с быстрым ссд.
Сотрудник 236
подтверждение от сервера не означает что сбросилось на диск.
Сотрудник 236
Не могу ничего про твоё железо сказать.
Сотрудник 236
Скажи задержки
Назар
Скажи задержки
какие и как посмотреть?
Сотрудник 236
так же как смотрел что в 8 раз медленнее
Назар
я запускаю примерно вот такой код в mongosh const date = new Date(); for (let i=0; i<10000; i++) {db[‚test‘].insertOne({entity: «entity», ‚message‘: «message», createdAt: new Date()})}; console.log(new Date() - date)
Назар
ну и вторым параметром передаю {writeConcern: {w: 1}}. Без него 110 секунд, с ним 14
Сотрудник 236
напиши {w: 1, j: false}
Назар
так вообще 8 секунд.
Сотрудник 236
тогда наверняка запись на диск.
Назар
звучит вроде логично. Но что и куда оно пишет? Если у меня реплика з 1 ноды. то пишет только 1 раз. По сути w: majority = w: 1. Но по факту разница по времени есть
Сотрудник 236
Когда ты отправляешь запрос на write. то сначала данные попадают в память. После этого тебе идёт ответ "ок, приняли". Потом он сбрасывается на диск (в journal). Если ты указал j: true, то придётся ждать пока данные реально упадут на диск. Зато надёжно, можно хоть из розетки комп дёргать.
Назар
сейчас попробовал {w: ‚majority‘, j: false}. В консоли куча сообщений slow query, и 1 insert занимает 100мс.
Сотрудник 236
Значит твой "быстрый ssd" недостаточно быстрый для монги. Протести его чем-нибудь. Я хз, у меня мака нет.
Oleg
Привет, такая задача возникла, есть документ со вложенными конструкциями, одна из таких конструкций это словарь (dict) с полем "text", нужно найти все документы, где есть такая конструкций и значение поля "text" содержит какую-то подстроку (которая известна до агрегации). Я пока что придумал использовать match (т.к. нужно сначала отфильтровать по _id), а потом find, но не уверен, что find рекурсивно обойдет документ. Подскажите, возможно вообще такой поиск организовать с помощью агрегации?
Сотрудник 236
тебе надо что-то вроде "**.text": <регулярка>?
Сотрудник 236
смотри в сторону graphLookup
Daniil
Привет. Кто подскажет: есть модель со свойством Events, тип которого List<ProjectEvent>. В это свойство сохраняю объекты, которые наследуются от ProjectEvent. Модель записывается в бд, но при десериализации Mongo.Driver выбрасывает ошибку, что есть неизвестные для ProjectEvent поля. Есть какое то решение для такой проблемы?
Daniil
Oleg
тебе надо что-то вроде "**.text": <регулярка>?
там даже не регулярка, просто проверка что подстрока входит в значение поля text, но за совет спасибо
yopp
Всем привет. Почему реплика сет на вставку гораздо медленнее чем single? Локально у меня реплика из 1 ноды. Разница на insertOne с writeConcern w 1 и без 8 раз. На маке локально. У коллеги локально то ли на винде то ли через докер всего лишь в 3 раза. На сервере тоже в 8 раз разница, но там 3 ноды в реплике. Вопрос, насколько реплика должна быть медленее на вставку, и что можно сделать, чтоб вернуть частично производительность?
Привет! insertOne в контексте реплик покажет сильную просадку в бенчмарках в связи с тем что кроме записи самого документа нужно еще и записать операцию в оплог. Условные «в 3 раза» медленнее это плюс-минус похоже на корректное измерение А о каких абсолютных числах идёт речь? Насколько вставка по одному документу критична для вашей нагрузки?
Артем
Всем дня доброго. Помогите, плз. разобраться. Есть коллекция (довольно тяжелая), количество документов около 4.7млн, весит примерно 22Га. Выполняю один и тот же простой запрос по {атрибут: значение} - время выполнения пляшет от минуты до 5. Нагрузки на базу нет. Что за чертовщина, куда копать можно?
Артем
Такая ситуация и по атрибуту с индексом, так и без индекса
Артем
explain показывает использование подходящего индекса
Назар
Привет! insertOne в контексте реплик покажет сильную просадку в бенчмарках в связи с тем что кроме записи самого документа нужно еще и записать операцию в оплог. Условные «в 3 раза» медленнее это плюс-минус похоже на корректное измерение А о каких абсолютных числах идёт речь? Насколько вставка по одному документу критична для вашей нагрузки?
не критично совсем, это я вообще случайно заметил. Вот в 3 раза медленнее на проде это было бы нормально в случае 3 нод в сете. Но оно в 8 раз медленее почему то. А у колеги локально в 3 раза как раз. И как я писал, локально у меня реплика из 1 ноды всего. Тоже медленно, хотя почему не понимаю. Я включил комп, хакинтош, ссд 6ГБ/c скорость. Там почему то еще медленее в 2 раза чем на маке. Ну абсолютное значение локально у меня 9мс вставка документа с 5-10 полями по 10 симовов. А без реплики за 1мс вставляет. Это я через system.profile смотрел. Писал выше скрипт, который делает 100_000 вставок. Там вообще 3 поля простых. 15 секунд против 110 разница.
Назар
а если написать {w: «majority», j: false}, то 100_000 вообще за 18 минут вставляет. Это я вообще не понимаю почему
yopp
Здравствуйте $match внутри поля не будет делать рекурсивный поиск, но вы можете с помощью $objectToArray и потом $filter сделать некоторое подобие рекурсивного поиска, если вы знаете какая вложенность у словарей https://www.mongodb.com/docs/manual/reference/operator/aggregation/filter/#mongodb-expression-exp.-filter https://www.mongodb.com/docs/manual/reference/operator/aggregation/#object-expression-operators Если вложенность неизвестна, то наиболее эффективным будет хранить плоское представление в базе
yopp
не критично совсем, это я вообще случайно заметил. Вот в 3 раза медленнее на проде это было бы нормально в случае 3 нод в сете. Но оно в 8 раз медленее почему то. А у колеги локально в 3 раза как раз. И как я писал, локально у меня реплика из 1 ноды всего. Тоже медленно, хотя почему не понимаю. Я включил комп, хакинтош, ссд 6ГБ/c скорость. Там почему то еще медленее в 2 раза чем на маке. Ну абсолютное значение локально у меня 9мс вставка документа с 5-10 полями по 10 симовов. А без реплики за 1мс вставляет. Это я через system.profile смотрел. Писал выше скрипт, который делает 100_000 вставок. Там вообще 3 поля простых. 15 секунд против 110 разница.
В целом это нормальное поведение, так как репликация имеет свои издержки и writeConcern сильно влияет на то, в какой момент клиент фактически получает ack операции Т.е w:0 j:0 > w:0 j:1 > w:1 j: 0 > w: majority j:0 > w: majority j: 1
yopp
С увеличением w вы уменьшаете вероятность потери операции. ack с majority в PSS* даёт гарантию что эта операция не попадет в rollback в случае отказа primary j: true с оговорками даёт гарантию что операция будет взята из журнала при возврате ноды в кластер, но не даёт гарантии что потом эта операция не попадет в rollback, в случае если у нового праймари были не все операции на момент отказа
yopp
Там выше была фраза что с j: true можно выдергивать питание, но тут есть важный нюанс: современные диски имеют еще свои слои кеширования. например DRAM кеш для flash памяти у которой в ячейке хранится больше 1 логического уровня (MLC, TLC QLC итд) И операционная система в случае операции которая явно указана как пропускающая кеш ОС, может гарантировать только факт что контроллер подтвердил выполнение операции. А была ли она фактически записана в DRAM или в NAND известно только самому контроллеру. По этому из розетки лучше не выдёргивать :)
yopp
explain показывает использование подходящего индекса
А из запроса большое количество документов возвращается? Все ли запросы покрыты индексами? Если есть запросы мимо индекса, то это может быть причиной что монга упирается в или в пропускную способность памяти, если все данные в неё помещаются, или в пропускную способность диска, если не помещаются
Артем
А из запроса большое количество документов возвращается? Все ли запросы покрыты индексами? Если есть запросы мимо индекса, то это может быть причиной что монга упирается в или в пропускную способность памяти, если все данные в неё помещаются, или в пропускную способность диска, если не помещаются
Давайте еще раз повторю - не сложно. Два запроса выборки - один по атрибуту с индексом, второй без индекса. И тот и другой пляшут временем выполнения с большим отклонением. Данных в результате несколько тыс документов. Ничего другого на серере монгу не дергает. да и в целом ничего не запущено.
Котяй
Нубовопрос можно? Ну, тогда спрошу. =) Вот в рамках одного соединения может быть несколько параллельных запросов на чтение? Или они будут в очередь становиться? Я думаю, что, скорей всего, может. Но вдруг. Вот, решил уточнить. =)
Котяй
А если провести эксперимент?
Набить БД данными и сделать два тяжёлых запроса? Если начало обоих запросов получится затрекать раньше, чем оба ответа, это будет 100% гарантией. Но если они встанут в очередь, не факт, это доказательством являться не будет. В любом случае, спросить в чате быстрее. Эксперимент дороже.
Котяй
Не, ну, если вам жалко, то мне, конечно, придётся проверить. Куда деваться. =)
Котяй
Но не будьте жадинами-то. Ну или можно просто сказать RTFM, дать ссылку.
Roman
Нубовопрос можно? Ну, тогда спрошу. =) Вот в рамках одного соединения может быть несколько параллельных запросов на чтение? Или они будут в очередь становиться? Я думаю, что, скорей всего, может. Но вдруг. Вот, решил уточнить. =)
Можно не ждать ответа здесь, а задать тот же вопрос более строго chatgpt, на основе ответа прогуглить его ответ (типа maxPoolSize) для верификации достоверности ответа и все, profit.
Roman
Я не знаю :(
Roman
Но по первому запросу в гугл получил уже намек на ответ
Котяй
Я не знаю :(
А, ок. Пардон. =)
Котяй
Я просто привык сначала спрашивать в чате, а потом гуглить. Просто люди чаще не против поделиться, и, если кто-то отвечает, то это то, что мне нужно. =)
Roman
Как хорошо, что нейросети теперь тоже делятся, даже оперативнее, чем люди 💪💪💪
Aleksey
Добрый день, поделитесь как можно увеличить скорость отдачи монгосом батчей? Или просто упираемся в потолок 16 мб, bson max size, на ответ? Связка mongodb-kafka source connector На сейчас максимум что выжали nreturned:6323 reslen:16751003 protocol:op_msg remoteOpWaitMillis:467 5529ms
yopp
Если для каждого поля (ключа), n количество значений, получается в этот массив нужно внести все n вариантов с этим ключом?
Если мне память не изменяет, то не нужно, монга вроде должна его как multi-key определить
Aleksey
5с на 16мб достаточно много. Запрос по шард ключу? Есть ли сортировки?
Change stream [{"$match":{"operationType":{"$in":["insert","update"]}}}] updateLookup
Rumar
CreateIndex когда надо использовать? Каждый раз при обращении к бд?
Kirilll
Зачем? один раз, когда создаешь индекс
Rumar
Зачем? один раз, когда создаешь индекс
У коллекции https://www.mongodbtutorial.org/mongodb-indexes/mongodb-compound-index/
Kirilll
Kirilll
индекс ты создаешь на основе своих запросов к базе важно правильно выбрать для себя индекс также излишне много индексов тоже плохо
Kirilll
индекс сохраняется, и не удаляется при закрытии бд/конекшна к бд и тп, если ты об этом
Oleksandr
Салам, есть проблема недостатка опыта с MongoDB. Хочу посоветоваться как лучше моделировать данные. У меня есть пользователи, кампании и организации. Каждому пользователю может быть назначена роль внутри организации и отдельные кампании внутри этой же организации - сама структуре данных выглядит приблизительно вот так { "assigned": [ { "role": "Admin", "organizationId": "6523d763a946c01177cbbc9a", "accounts": [ { "role": "Member", "accountId": "6523d763a946c01177cbbd12" }, { "role": "Admin", "accountId": "6523d763a946c01177cbbf34" } ] }, { "role": "Member", "organizationId": "6523d763a946c01177cbbd45", "accounts": [ { "role": "Member", "accountId": "6523d763a946c01177cbb987" } ] } ] } Дело в том что сейчас это сделано таким образом в Mongoose, что AssignedUserOrganization и AssignedUserAccount это не отдельные коллекции а скорее просто документы которые находятся внутри UserSchema @Schema({ _id: false }) export class AssignedUserAccount { @Prop({ type: Types.ObjectId, ref: 'Account' }) accountId: Types.ObjectId; @Prop({ type: String, enum: UserAssignmentRole }) role: UserAssignmentRole; @Prop({ type: Settings }) settings: Settings; } @Schema({ _id: false }) export class AssignedUserOrganization { @Prop({ type: Types.ObjectId, ref: 'Organization' }) organizationId: Types.ObjectId; @Prop({ type: [AssignedUserAccount] }) accounts: AssignedUserAccount[]; @Prop({ type: String, enum: UserAssignmentRole }) role: UserAssignmentRole; } В данный момент ужасно неудобно обновлять какой-либо AssignedUserAccount если я хочу определённому пользователю сменить роль внутри какой-либо кампании внутри организации Собственно, в чём вопрос - будет ли нормальным решением вынести эти вещи в отдельные коллекции и просто их присоединять к документу пользователя через $lookup? Или это мой мозг привыкший к Postgres автоматически привык всё это разделять на таблицы/коллекции? 🙏
Nick
Салам, есть проблема недостатка опыта с MongoDB. Хочу посоветоваться как лучше моделировать данные. У меня есть пользователи, кампании и организации. Каждому пользователю может быть назначена роль внутри организации и отдельные кампании внутри этой же организации - сама структуре данных выглядит приблизительно вот так { "assigned": [ { "role": "Admin", "organizationId": "6523d763a946c01177cbbc9a", "accounts": [ { "role": "Member", "accountId": "6523d763a946c01177cbbd12" }, { "role": "Admin", "accountId": "6523d763a946c01177cbbf34" } ] }, { "role": "Member", "organizationId": "6523d763a946c01177cbbd45", "accounts": [ { "role": "Member", "accountId": "6523d763a946c01177cbb987" } ] } ] } Дело в том что сейчас это сделано таким образом в Mongoose, что AssignedUserOrganization и AssignedUserAccount это не отдельные коллекции а скорее просто документы которые находятся внутри UserSchema @Schema({ _id: false }) export class AssignedUserAccount { @Prop({ type: Types.ObjectId, ref: 'Account' }) accountId: Types.ObjectId; @Prop({ type: String, enum: UserAssignmentRole }) role: UserAssignmentRole; @Prop({ type: Settings }) settings: Settings; } @Schema({ _id: false }) export class AssignedUserOrganization { @Prop({ type: Types.ObjectId, ref: 'Organization' }) organizationId: Types.ObjectId; @Prop({ type: [AssignedUserAccount] }) accounts: AssignedUserAccount[]; @Prop({ type: String, enum: UserAssignmentRole }) role: UserAssignmentRole; } В данный момент ужасно неудобно обновлять какой-либо AssignedUserAccount если я хочу определённому пользователю сменить роль внутри какой-либо кампании внутри организации Собственно, в чём вопрос - будет ли нормальным решением вынести эти вещи в отдельные коллекции и просто их присоединять к документу пользователя через $lookup? Или это мой мозг привыкший к Postgres автоматически привык всё это разделять на таблицы/коллекции? 🙏
Да это нормально, природа данных такова что так будет удобнее
Oleksandr
Ilia
Гайс, а укого сохранилась 4.2 СЕ для убунты? Ищу винтаж
Нуриддин
В Гугле был гитхаб где зранили все релизы и докерфайлы монги
Dmitry
Гайс, а укого сохранилась 4.2 СЕ для убунты? Ищу винтаж
Нашел на оф сайте. Но надо упорно промотать вниз. https://www.mongodb.com/try/download/community-edition/releases/archive
Anatoly
народ привет, есть кто юзал mongodb bi-connector у вас нормально работает настройка конфига, а именно - uidSubtype3Encoding ? цель надо запросить через указанный connector документ, но id который у нас есть, он в формате - UUID(v4) - предположительно что в этом , а наша монга хранит в формате LUUID, Поэтому имя ID который мы получили в формате- — UUID(v4), не получается найти в нашей монге, при использование bi-connector Все пишу, что в языках типа c#/java и т.п решается через настройки подключения, в bi-connector по факту это должно решиться , с помощь uidSubtype3Encoding в конфиге, вопрос решится почти элементарно, но видимо это работает как то не так.
Asset
Всем салам подскажите монгу ставил локально пришло уведомление о деактивации кластера и все перестало работать локальная то же оплачивать надо
Asset
Сори я тут сам заморочился
Kino Recovery
добрый вечер, можно ли к монге прикрутить полнотекстовый поиск? В идеале sphinx
Nick
добрый вечер, можно ли к монге прикрутить полнотекстовый поиск? В идеале sphinx
А что помешает? Напишите код для переноса данных или для одновременного изменения и в монге и сфинксе и вуаля
Kino Recovery
А что помешает? Напишите код для переноса данных или для одновременного изменения и в монге и сфинксе и вуаля
после индексации, в сфинксе останется исходные данные или внутри сфинкса только индекс?
Kino Recovery
Как сделаете
а вообще не творю ли я дмчь пытаясь прикурить туда сфинкс?
Nick
а вообще не творю ли я дмчь пытаясь прикурить туда сфинкс?
Вполне нормально, полнотекс в монге считай никакой
yopp
а вообще не творю ли я дмчь пытаясь прикурить туда сфинкс?
Монговцы в Атласе используют Apache Lucene, так что можно сказать пилить внешний полнотекстовый индекс это по схеме вендора :)
yopp
В целом это странное решение: есть API для подключения разных реализаций хранилищ, но при этом нет API для подключения разных реализаций индексов. Если бы сделали, вероятнее всего кто-то бы запилил нормальный полнотекстовый индекс на какой-то готовой технологии. Вероятно это связано со сложностью интеграции внешних индексов в планировщик, но это только предположение. Несколько лет назад кто-то из участников группы даже пытался допилить существующий полнотекстовый индекс, но к похоже до стабильной реализации довести не получилось, плюс перспективы протащить такие патчи в саму монгу достаточно туманны
Kirilll
Всем привет Кто может подсказать Если в прикладе (PyMongo) указать несколько монгосов, как точки входа - какой будет выбран для каждого запроса? По нагрузке или по очереди? Версия монги 4.4.9
Сергей
Ребятушки,всем доброго дня! Кто уже пользовался 8 версией монги?