Дмитрий
Доброго времени суток, создал в docker-compose сервис монги : db: image: mongo:4.4.1-bionic container_name: db environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: admin MONGO_INITDB_DATABASE: admin command: mongod --auth volumes: - db:/data/db restart: always networks: - azia-backend ports: - 27017:27017 Пытаюсь через компас к нему подключиться (строка mongodb://admin:admin@localhost:27017/admin?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&ssl=false) и пишет что я не авторизован Второй день не могу понять в чем причина, может знает кто?
Roman Khonichev
логи в контейнере монги что говорят?
ⒶⓋⒶ
const handleDuplicateFieldsDB = (err) => { const errmsg = Object.keys(err.keyValue)[0]; const value = err.keyValue[errmsg].match(/(["'])(?:\\.|[^\\])*?\1/)[0]; const message = Duplicate field (${errmsg}). Duplicate field value: ${value}. Please use another value (${err.keyValue[errmsg]}); return new AppError(message, 400); }; const sendErrorDev = (err, res) => { res.status(err.statusCode).json({ status: err.status, error: { err, errmsg: err.message }, message: err.message, stack: err.stack, }); };
Dmitriy
Коллеги, скажите пожалуйста. в group делаю такую вещь 'a.b': {$sum: '$a.b'}, И мне пишет The field name 'a.b' cannot contain '.' Как быть в таком случае?
Viktar
Поставьте $
Dmitriy
Поставьте $
где именно?
Viktar
Иначе у вас получается поле а.б а точки в поле нельзя
Dmitriy
Получается что у меня обьекта a нет, и оно пытается обратиться к обьекту a , а его не существует и до поля b запрос не доходит и парадает
Viktar
Он результат пытается сохранить в поле а.б (не в объект)
Viktar
Вместо а.б сделайте имя без точки. Мне не очень удобно с телефона писать
Viktar
'ab': {$sum: '$a.b'}
Viktar
Либо $a.b это зависит от вашей структуры и группировки
Dmitriy
Понял, спасибо
Дмитрий
Почему localhost? Разве там монга?
Я через компас пытаюсь подключиться
Дмитрий
логи в контейнере монги что говорят?
{"t":{"$date":"2021-03-30T09:10:34.800+00:00"},"s":"I", "c":"ACCESS", "id":20249, "ctx":"conn53","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1","principalName":"admin","authenticationDatabase":"admin","client":"172.29.0.1:58558","result":"UserNotFound: Could not find user \"admin\" for db \"admin\""}}
I
Всем привет. Как сохранить список моделей (insretAll) При этом не сохранять модельки если их id уже есть
I
в этот список
Mansur
Ребят привет! Использую mongo transactions и change streams и официальный драйвер mongodb для golang. Вопрос такой, при вызове метода StartTransaction() и последующих операциях, к примеру InsertOne(), срабатывает change stream, хотя я ожидал, что стрим сработает только после вызова Commit(). Можно ли как-нибудь это настроить, кто-нибудь подскажет?
Denis
по логике не должен
Mansur
У меня он не в контексте (
Mansur
Но вот почему то так работает
Mansur
А в документации, ничего не вижу касаемо этого вопроса
Mansur
по логике не должен
Вопрос снят, спасибо, разобрался, благодаря вашей подсказке. Нашел ошибку в контекстах при открытии транзакции. Процесс инсерта выполнялся не в рамках транзакции, поэтому и срабатывал стрим.
Arystan
Ребят, всем салем. нужна помощь есть две таблицы branches, users branches: group_id:int enabled:bool, users: userID:int, branches:[ { group_id:int, balance:float }, ] и хочу вот теперь получить данные из таблицы users филиалы из таблицы branches но с филтром enabled:true, чтобы в результате приходил ответ следующий: result: userID, branches:[{branchID, balance}] Вот мой запрос: { from: 'branches', let:{branchID:"branches$.group_id"}, pipeline:[ {$match:{$expr:{ $and: [ { $eq: [ "$enabled", true ] }, { $eq: [ "$group_id","$$branchID" ] } ] }}} ], as: 'branches' }
андрей
Привет, нужно ли создать пользователя? Если приконектится можно без этого
Александр
Добрый день. Подскажите, пожалуйста, как ускорить загрузку данных на странице ? У меня есть одна большая коллекция, которая имеет такую структуру и я формирую правильный мне список в контроллере через Lodash. Подскажите советом пожалуйста )
Looch
Roman
мдааа, печально что у сортировки буква "П" идет раньше буквы "С" ((
Александр
Это может как -нибудь помочь ?
Александр
Ilya
День добрый. Есть коллекция. Есть условное поле id - числовой идентификатор. Необходимо реализовать авто инкрементацию данного поля, то есть 1 документ в коллекции - id=0, для второго id=1, для третьего id=2 и так далее. Однако если действовать просто - запрашивать count в коллекции, и это число ставить в качестве id для нового создаваемого документа, то существует риск дублирования id, если запросы выполнятся одновременно. Могу я решить данную проблему с помощью транзакций? Ведь в монге оптимистическая блокировка, а в описанном мною случае write conflict просто не может случиться. И если нет, то какие вообще пути существуют для решения данной проблемы?
Nick
День добрый. Есть коллекция. Есть условное поле id - числовой идентификатор. Необходимо реализовать авто инкрементацию данного поля, то есть 1 документ в коллекции - id=0, для второго id=1, для третьего id=2 и так далее. Однако если действовать просто - запрашивать count в коллекции, и это число ставить в качестве id для нового создаваемого документа, то существует риск дублирования id, если запросы выполнятся одновременно. Могу я решить данную проблему с помощью транзакций? Ведь в монге оптимистическая блокировка, а в описанном мною случае write conflict просто не может случиться. И если нет, то какие вообще пути существуют для решения данной проблемы?
первый путь решения - не использовать автоинкременты и донести до бизнеса, что для его задачи оно не требуется второй путь - если по какойто причине (лень, не хочется связываться, хочется гемороя дополнительного, и т.п.) всетаки реально нужен автоинкремент, то заводим коллекцию, в нее документ с счетчиком, дергаем $inc и тащим измененный док третий вариант - на случай если пробелы между автоинкрементным id прям ваще недопустимы, бизнес изза этого попадает на бабки или нелояльность юзеров (подтвержденную, а не со слов менеджеров) - тогда уже берем транзакции, все становится медленно, но зато честный автоинкременты
Arsen
привет! как можно оптимизировать поиск текста регулярным выражением?
Евгений
Кто-то делал миграции для нормализации данных Может есть статейка где-то как это замутить правильно?
Александр
Новый вопрос. Выяснил, что это обрабатывается 4 секунды. Как это переписать на правильный запрос и сократить время?
Looch
Подскажите пожалуйста
у тебя ж там написано даже в комменте что алгоритмическая сложность очень большая, попробуй сотябы начать с того что бы избегать циклов внутри других циклов
Looch
почитай вообще доку, может ты сможешь что-то из этого тут применить https://docs.mongodb.com/manual/core/map-reduce/
Александр
ну не выгребай все данные
То есть Map-Reduce сделает мне за 1 секунду ?
Ilya
Нет, именно find из монги 4 секунды работает
moment очень тяжелый вроде бы, попробуйте убрать ради эксперимента moment и замерить время насчет find, если вы используете mongoose, то попрьуйте еще параметр lean:true
Looch
То есть Map-Reduce сделает мне за 1 секунду ?
я не знаю что тебе вообще нужно, может тебе ток 1 юзер нужен, у монги куча операторов для аггрегации данных https://docs.mongodb.com/manual/reference/operator/aggregation/
Looch
может тебе тут сначала нужен какой-то filter
Александр
Точно
Looch
почитай доку и подумай как можно вытаскивать не все данные а только те которые тебе нужны
Looch
может даже монга и быстро работает но ты по сети гоняешь много трафика и это занимает время
Nick
Нужно переписать const users = await InformationUsers.find(); Чтобы не 4 секунды было
для начала не делать просто find который тянет все данные
Nick
использовать aggregation и настроить преобразования и фильтрации в нем
Nick
Новый вопрос. Выяснил, что это обрабатывается 4 секунды. Как это переписать на правильный запрос и сократить время?
банально проверку на наличие сессии (первый иф) надо делать условием выборки
Nick
и вроде как все что делается внутри обработки укладывается в возможности агрегаций монги и можно получить сразу ответ
Nick
привет! как можно оптимизировать поиск текста регулярным выражением?
можно только одним образом - использовать индекс по полю и использовать префиксный поиск с символом ^ подробнее https://docs.mongodb.com/manual/reference/operator/query/regex/#index-use
Nick
Кто-то делал миграции для нормализации данных Может есть статейка где-то как это замутить правильно?
думаю особой магии нет, прорабатываете новую структуру БД, пишите софт, провереяете что стало лучше или дорабатываете, пишите скрипты миграции, стопаете всех старых пользователей монги и прогоняете скрипты и заполняете новую структуру, потом подрубаете новую версию софта
Евгений
ок, спасибо
Nick
ок, спасибо
такое глобальное изменение структуры скорее всего потребует переписывание всего что связано с работой с базой, что наверняка повлечет и другие доработки - так что фактически новый софт пилить
Евгений
пушем в БД занимаюсь не я, это делает другой плагин совсем в другой зоне ответтвенности, потому и подумал проводить миграции, это приведет к распуханию БД, но при этом сохранит существующую структуру, а по таймеру можно прогонять новые данные в нормализированную стируктуру… так что пока не знаю как это организовать (((
Александр
банально проверку на наличие сессии (первый иф) надо делать условием выборки
Примерно, что то такое? Нужно ли мне новую коллекцию создать из старой для оптимизации ?
Nick
Примерно, что то такое? Нужно ли мне новую коллекцию создать из старой для оптимизации ?
новую не нужно, потребуется если только вы не сможете покрыть свои потребности возможностями монги, а там богатый функционал уже
Евгений
ну вот к примеру на MSSql когда мы хотели расширить БД новым полем или зависимостью, я делал миграции для того чтобы покрыть предыдущие данные проинитив их значением по имолчанию или NULL чтобы это все не падало при запросах Думал что и тут такое есть. Вот к примеру докину я Схему ОдикКоМногим, но с моими знаниями MongoDB я понимаю что нужно переломатить всю базу в каком-то цикле, и запушить ссылки на эту модельку, а в SQL подобных БД вроде можно было указать новуи и старую модель и мигрировать. Я конечно давно уже не пилил yf cdzprt С# и реляционных БД, но вроде как помню о такой возможности.
Евгений
LДа это понятно, но из-за того что люди думают что в NoSQL можно пушить все одним скоупом при запросах бизнеса на многоуровневые выборки и калькуляции результатов агрегации занимают около 7-9 секунд, что совсем НЕ ТОРТ По-этому данные нужно готовить перед отправкой в БД А. то потом такие горе разрабы говорят MongoDB - дно….
Nick
ну вот к примеру на MSSql когда мы хотели расширить БД новым полем или зависимостью, я делал миграции для того чтобы покрыть предыдущие данные проинитив их значением по имолчанию или NULL чтобы это все не падало при запросах Думал что и тут такое есть. Вот к примеру докину я Схему ОдикКоМногим, но с моими знаниями MongoDB я понимаю что нужно переломатить всю базу в каком-то цикле, и запушить ссылки на эту модельку, а в SQL подобных БД вроде можно было указать новуи и старую модель и мигрировать. Я конечно давно уже не пилил yf cdzprt С# и реляционных БД, но вроде как помню о такой возможности.
в монге когда добавляется новое поле вам надо также определить чем оно должно инититься, если допустимо вообще его не создавать - то и делать ничего не нужно на стороне БД, а только лишь в коде предусмотреть что поле опциональное если же вам критично все проинитить, то точно также как вы делаете это в mssql пишите скрипт для простановки с той лишь разницей что там вы пишите скульник, а тут на aggregate функцию с $merge https://docs.mongodb.com/manual/reference/operator/aggregation/merge/#pipe._S_merge
Евгений
спасибо, почитаю…
Александр
Подскажите, как это переписать для mongodb aggregate ?
Nick
Подскажите, как это переписать для mongodb aggregate ?
$match $project: внутри $reduce по массивам, и там уже все преобразования и проверки какие вам надо