Сотрудник 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
yopp
Артем
Всем дня доброго. Помогите, плз. разобраться. Есть коллекция (довольно тяжелая), количество документов около 4.7млн, весит примерно 22Га.
Выполняю один и тот же простой запрос по {атрибут: значение} - время выполнения пляшет от минуты до 5. Нагрузки на базу нет. Что за чертовщина, куда копать можно?
yopp
Артем
Такая ситуация и по атрибуту с индексом, так и без индекса
Артем
explain показывает использование подходящего индекса
Назар
а если написать {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
yopp
С увеличением w вы уменьшаете вероятность потери операции. ack с majority в PSS* даёт гарантию что эта операция не попадет в rollback в случае отказа primary
j: true с оговорками даёт гарантию что операция будет взята из журнала при возврате ноды в кластер, но не даёт гарантии что потом эта операция не попадет в rollback, в случае если у нового праймари были не все операции на момент отказа
yopp
Там выше была фраза что с j: true можно выдергивать питание, но тут есть важный нюанс: современные диски имеют еще свои слои кеширования. например DRAM кеш для flash памяти у которой в ячейке хранится больше 1 логического уровня (MLC, TLC QLC итд)
И операционная система в случае операции которая явно указана как пропускающая кеш ОС, может гарантировать только факт что контроллер подтвердил выполнение операции. А была ли она фактически записана в DRAM или в NAND известно только самому контроллеру. По этому из розетки лучше не выдёргивать :)
yopp
explain показывает использование подходящего индекса
А из запроса большое количество документов возвращается? Все ли запросы покрыты индексами? Если есть запросы мимо индекса, то это может быть причиной что монга упирается в или в пропускную способность памяти, если все данные в неё помещаются, или в пропускную способность диска, если не помещаются
Артем
Котяй
Нубовопрос можно? Ну, тогда спрошу. =) Вот в рамках одного соединения может быть несколько параллельных запросов на чтение? Или они будут в очередь становиться? Я думаю, что, скорей всего, может. Но вдруг. Вот, решил уточнить. =)
Vitalii
Котяй
А если провести эксперимент?
Набить БД данными и сделать два тяжёлых запроса? Если начало обоих запросов получится затрекать раньше, чем оба ответа, это будет 100% гарантией. Но если они встанут в очередь, не факт, это доказательством являться не будет. В любом случае, спросить в чате быстрее. Эксперимент дороже.
Котяй
Не, ну, если вам жалко, то мне, конечно, придётся проверить. Куда деваться. =)
Котяй
Но не будьте жадинами-то. Ну или можно просто сказать RTFM, дать ссылку.
Roman
Котяй
Roman
Я не знаю :(
Roman
Но по первому запросу в гугл получил уже намек на ответ
Котяй
Я просто привык сначала спрашивать в чате, а потом гуглить. Просто люди чаще не против поделиться, и, если кто-то отвечает, то это то, что мне нужно. =)
Roman
Как хорошо, что нейросети теперь тоже делятся, даже оперативнее, чем люди 💪💪💪
Yura
Добрый день, подскажите пожалуйста, есть коллекция с ключами (допустим):
a,b,c,d,e,f,g,h
Запросы к этой коллекции могут приходить с различной комбинацией этих полей,
b,c d,e,h a,f,g и т.д. Как правильно их оптимизировать/ускорить? Создать для каждого ключа индекс или для каждого запроса составной индекс на комбинацию? Плодить большое количество индексов тоже не очень хорошая идея как я понимаю, т.к. будет страдать вставка.
?
yopp
Добрый день, подскажите пожалуйста, есть коллекция с ключами (допустим):
a,b,c,d,e,f,g,h
Запросы к этой коллекции могут приходить с различной комбинацией этих полей,
b,c d,e,h a,f,g и т.д. Как правильно их оптимизировать/ускорить? Создать для каждого ключа индекс или для каждого запроса составной индекс на комбинацию? Плодить большое количество индексов тоже не очень хорошая идея как я понимаю, т.к. будет страдать вставка.
Здравствуйте! Такие схемы лучше укладывать в массив словарей формата
{key: a, value: b},
Тогда вы можете сделать один индекс {field.key: 1, field.value: 1}, который будет покрывать весь возможный набор комбинаций
Yura
Yura
Aleksey
Добрый день, поделитесь как можно увеличить скорость отдачи монгосом батчей? Или просто упираемся в потолок 16 мб, bson max size, на ответ?
Связка mongodb-kafka source connector
На сейчас максимум что выжали
nreturned:6323 reslen:16751003 protocol:op_msg remoteOpWaitMillis:467 5529ms
yopp
yopp
Aleksey
5с на 16мб достаточно много. Запрос по шард ключу? Есть ли сортировки?
Change stream
[{"$match":{"operationType":{"$in":["insert","update"]}}}]
updateLookup
Rumar
CreateIndex когда надо использовать? Каждый раз при обращении к бд?
Kirilll
Зачем?
один раз, когда создаешь индекс
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 СЕ для убунты? Ищу винтаж
Нуриддин
В Гугле был гитхаб где зранили все релизы и докерфайлы монги
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
Kino Recovery
Nick
Kino Recovery
Как сделаете
а вообще не творю ли я дмчь пытаясь прикурить туда сфинкс?
Nick
yopp
В целом это странное решение: есть API для подключения разных реализаций хранилищ, но при этом нет API для подключения разных реализаций индексов. Если бы сделали, вероятнее всего кто-то бы запилил нормальный полнотекстовый индекс на какой-то готовой технологии. Вероятно это связано со сложностью интеграции внешних индексов в планировщик, но это только предположение.
Несколько лет назад кто-то из участников группы даже пытался допилить существующий полнотекстовый индекс, но к похоже до стабильной реализации довести не получилось, плюс перспективы протащить такие патчи в саму монгу достаточно туманны
Kirilll
Всем привет
Кто может подсказать
Если в прикладе (PyMongo) указать несколько монгосов, как точки входа - какой будет выбран для каждого запроса? По нагрузке или по очереди?
Версия монги 4.4.9
Сергей
Ребятушки,всем доброго дня! Кто уже пользовался 8 версией монги?