Artem
?
Artem
вот сам индекс db.getCollection("messages").createIndex({"user_id": 1, "bot_id": 1, "direction": 1})
yopp
yopp
Но наиболее эффективный способ отказаться от схемы 1 сообщение 1 документ
Artem
?
yopp
Тогда какую схему использовать
Группировать сообщения в один документ, по паре отправитель/получатель или если направление важно то по тройке отправитель/получатель/направление. Количество сообщений в документе зависит от максимального размера сообщения. Но в целом если хранить около сотни, вы на два порядка уменьшите количество ключей для сканирования
Artem
И другой вопрос Если то же самое делать на MySQL то будет быстрей считать тотал по индексу на тех же объемах
yopp
https://www.mongodb.com/blog/post/building-with-patterns-the-bucket-pattern https://www.mongodb.com/blog/post/paging-with-the-bucket-pattern--part-2 https://docs.mongodb.com/ecosystem/use-cases/storing-comments/
yopp
И другой вопрос Если то же самое делать на MySQL то будет быстрей считать тотал по индексу на тех же объемах
Вы по индексу тоже можете считать. В монге это называется covered query. Ваш запрос не covered query, так как нет проекции. выше указано какой проекцией вы можете включить covered query
yopp
Но в любом случае, сканировать десятки миллионов ключей будет дорого
yopp
В любой базе
Павел 💻
Всем привет! Подскажите пожалуйста, когда выбираем mongoDb , а когда Mysql?
Nick
Всем привет! Подскажите пожалуйста, когда выбираем mongoDb , а когда Mysql?
судя по вопросу,то знаний монги скорее всего крайне мало, либо мало знаний по мускулю, и ответ для вас будет следующий: когда куча времени и желания что-то новое изучить - то то что не знаешь, когда надо быстро срочно и желательно вчера, то то что уже знаешь если ожидаете увидеть портянку преимуществ - то это можно загуглить, всеравно все сводится к наличию спецов в команде
Nick
Всем привет! Подскажите пожалуйста, когда выбираем mongoDb , а когда Mysql?
в общем случае на текущий момент монга покрывает все что может мускуль и сверху добавляет шардирование и реплику из коробки. (ну разве что триггеров в чистом виде нет и упоротых процедур)
Павел 💻
И ПЕРСПЕКТИВНЕЕ
Nick
лучше в данном случае выбрать примерно контору где хотите работать и узнать ее стек технологий, SQL или NoSQL там и с этого начинать. А если для себя, то начните с монги - она проще в освоении, если уже умеешь в js - много актуальных материалов в сети. Простой старт, разберешься с концепцией хранения данных вне приложения. Как освоишься, то надо обязательно пощупать mysql - чтобы иметь понимание что есть что и разобраться в синтаксисе SQL - посмотрите на мир данных с другой стороны.
Nick
Разве в монге есть foreign key?
есть транзакции, а значит есть все что нужно для целостности - и форейн ключи, только вам придется их самому кодить
Nick
сложно, но можно) пластелин, лепи что хочешь
Vladimir
Ну просто если очень надо вот это все, то мускуль, скорее всего, подойдёт больше и будет проще, чём из пластилина все это лепить :)
Yaroslav
вот это вот все - можно детальнее? транзакции действительно иногда нужны (хотя не стоит злоупотреблять), foreign key - зачем? в монге документная модель, лепить форейн кеями зависимости при правильном подходе как раз и не нужно.
Nick
Ну просто если очень надо вот это все, то мускуль, скорее всего, подойдёт больше и будет проще, чём из пластилина все это лепить :)
тут уже начинается разговор о конкретных проектах, командах, наличии спецов, запасе времени, бюджетах и т.д. без этого всего всегда можно придумать агрумент по типу "а вот в команде никто не умеет в mysql, мы не хотим искать новых людей" или "а вот начальник сказал все на монге сделать" - на фоне которых лепка из пластилина вполне себе решение)
Yaroslav
целостность в монге обеспечивается тем, что все зависимости, которые в реляционных БД вы поддерживали через foreign key, вы храните в одном документе. это конечно не в 100% случаев возможно, но в целом это то, что соответсвует "философии" монги. ну и денормализация да, в монге нормальный подход. честно, за 4 года на монге потребности в foreign key не возникало. в транзакциях иногда, но после перехода на микроснервисы и транзакции нужны нечасто.
Artem
В любой базе
Спасибо большое за информацию
Artem
было очень полезно
Ruslan
TypeError: Cannot read property 'collection' of null
Ruslan
Почему данная ошибка если я коллекцию создал?
Roman
Делаю запрос в базу данных с кода, то возвращяется пустой массив. Если делаю такой же запрос с терминала, то выводит данные
Daniil
Делаю запрос в базу данных с кода, то возвращяется пустой массив. Если делаю такой же запрос с терминала, то выводит данные
Стоит проверить к той ли базе данных вы подключаетесь из кода и нужную ли коллекцию используете
Dmitriy
я же вчера вам давал ссылку на доку))) суть описанного по ссылке была в том, что вы делаете ttl индекс, например на час 3600 секунд, этот индекс вы делаете на поле с типом isodate, в котором хранится временная метка к которой добавляются секунды из ttl индекса. соответственно если вам надо продлить время жизни для документа вы просто значение в поле на котором индекс уменьшаете на какое-то значение. ну т.е. давайте на примере: 1. у вас есть поле expire_at в документе, которое имеет тип isodate 2. на это поле вы добавляете ttl индекс как написано в доке: db.col.createIndex( { "expire_at": 1 }, { expireAfterSeconds: 3600 }) 3. далее для уменьшения/увеличения времени жизни документа вы изменяете просто значение в поле expire_at (соответственно если надо время жизни уменьшить, то вы увеличиваете время в данном поле, надо увеличить время жизни, вы уменьшаете значение в поле)
Dmitriy
тогда вам надо удалить старый индекс и сделать новый, но это плохая практика, т.к. переиндексация потребует времени и скажется на производительности. я бы вам рекомендовал все таки обновить нужные документы, т.к. updateMany выйдет дешевле
Dmitriy
хм, странная реализация по верификации пользователя, т.к.: 1. в коллекции пользователей будут и верифицированные пользователи и соответственно думается мне что в данной же коллекции для работы с пользователями будут еще индексы не только ttl. соответственно каждое удаление будет приводить к перестроению индекса, что опять же негативно скажется на производительности приложения. 2. что будет с вашей бизнес логикой (уж коли мы сразу хотим задел на будущее) если не верефицированному пользователю не дошло письмо и встанет задача отсылки повторного письма для верификации? вы предложите пользователю снова пройти регистрацию? - это крайне плохая история по UX, особенно если регистрация это заполнение более чем 2 полей. в классическом варианте это решается добавлением некого поля статуса, которое изменяется после прохождения верификации. и соответственно далее у вас логика всего приложения строится от получения пользователя вместе со статусом и проверкой значения в поле статуса. в самом простом варианте это делается при авторизации (есть более сложные кейсы когда не верифицированному пользователю разрешается авторизоваться, но ограничиваются действия внутри дашборда)
Dmitriy
в случае варианта со статусом будет добавление в индекс, а не переиндексация, не путайте
Dmitriy
но дело ваше как реализовывать, главное чтобы заказчика устраивало
Dmitriy
так как раз в этом случае вы и варьируете значением поля expire_at. допустим у вас есть ttl индекс на 3600 секунд и заказчик сейчас хочет чтобы пользователи зачищались через сутки, соответственно при вставке записи в базу вы делаете: expire_at = текущее время - 86400 * 1 + 3600
Dmitriy
захочет через 7 дней, ок, вы меняете константу с количеством дней и у вас становится: expire_at = текущее время - 86400 * 7 + 3600
Гена
Там что-то в духе map(f(currentItem) {currentItem[“_id”]}))
Доброе утро Что-то у меня не получается понять куда надо добавить в селект это( db.getCollection('col').aggregate( [{ $match: { field: { "$in": [35, 32, 51, 5, 3, 18, 40, 28, 58, 52, 59, 93, 22, 49, 47, 143, 19, 48, 43, 114, 41, 27, 46, 119, 7, 67, 25, 34] } } }, { $project: { "_id": "$_id" } }]) Не подскажите ?
Гена
я передаю вывод в курсор, а потом надо как то запарсить
Nick
Из курсора соберите массив и обратывайте как хотите
Гена
Знать бы как это делать...что мне погуглить чтоб вас не дёргать?
Гена
ну ок..
Гена
спасибо
Dmitriy
Я вам вчера ещё сказал, распрарсите ответ на баше) и не теряйте времени)
Dmitriy
Там все 3 пункта, что я вам вчера описывал на баше простенький скрипт
Fenicu
Добрый день, не пойму как сформировать запрос, чтобы произошла сортировка по количеству элементов в списке, делаю так { "like": {"$gt": 0} } но он просто по значению выдаёт результат и не сортирует по количеству элементов
Dmitriy
количество элементов у вас существует как отдельное поле со скаляром типа int например или вы хотите вычислить количество элементов, например, в массиве на лету?
Fenicu
у меня документы типа "_id" : some id, "like": array of int
Fenicu
и вот нужно подсчитать количество элементов внутри like и выдать сортировку
Dmitriy
@dd_bb если будет возможность проверьте, пожалуйста, правильность работы $sort в агрегации, судя по тому что я вижу работает как-то не правильно
Oleg
Не подскажите возможно подключиться к VPN имея IP ADDRESS, Port, password, если User был не указан ?
Fenicu
Наталья
всем привет, какими методами и какие метрики мониторите у вашх монг?
Наталья
prometeus/graphite
Наталья
есть ли возможность выявлять долго исполняющиеся запросы средствами мониторинга
Aleksey
Скажите, насколько правильно/не правильно будет использовать pymongo или mongoengine ? Я вижу только в проверках полей документа при записи/редактировании. Есть в этом вопросе лучшие практики ?
Daniil
mongoengine - это object data mapper
Daniil
pymongo просто драйвер
Dmitriy
Скажите, насколько правильно/не правильно будет использовать pymongo или mongoengine ? Я вижу только в проверках полей документа при записи/редактировании. Есть в этом вопросе лучшие практики ?
лучшая практика - это использовать то что хорошо знаете, либо изучение, и далее реализация задачи на данном инструменте, занимает меньше всего времени
Dmitriy
если не знаний не понимания нет, то и разницы нет))))
Гена
Коллеги, подскажите, можно ли в монго найти информацию о текущих сессиях? Откуда они идут и к какой бд
Гена
монга в3.4
yopp
https://docs.mongodb.com/manual/reference/method/db.currentOp/
Гена
https://docs.mongodb.com/manual/reference/method/db.currentOp/
В кластере показатель "open session count" 500+ как можно посмотреть откуда эти сессии? db.currentOp показывает текущую активную сессии и их там не 500
Гена
есть какой-то другой способ?
Гена
вы монго хостинг пилите что ли?)
Нет. Просто у нас в монге подскочило кол-во сессии и я хочу понять откуда ноги растут и с какой тачки идут запросы
Гена
у нас вот 500 открытых сессий, как узнать сколько к какой базе относятся ?
Dmitriy
Нет. Просто у нас в монге подскочило кол-во сессии и я хочу понять откуда ноги растут и с какой тачки идут запросы
если не найдете другого способа, то мы лет 10 назад на мускуле такое решали отрезанием доступа по ip последовательно. кто пришел с воплями что у меня ничего не работает, тот и выех коннекшен пулл))) грубо и не очень красиво, но крайне эффективно))))
Гена
))) ну мы так не можем конечно же)) но очень странно что у монги нет такого функицонала. ИЛи я не вижу каррентОП показывает текущий запрос, а список сессий не могу найти
Гена
листсешшн есть тольк от 3.6 версии