Artem
?
Artem
вот сам индекс db.getCollection("messages").createIndex({"user_id": 1, "bot_id": 1, "direction": 1})
yopp
такой вопрос, есть коллекция с 200 миллионами сообщений, я подсчитываю для определенного пользователя количество исходящих сообщений.
их там 80 миллионов,
db.messages.find({
user_id: 7147280,
bot_id: '35f41b59-77cd-409c-a863-04c4ba18a0e7',
direction: 2
}).hint({
"user_id" : 1,
"bot_id" : 1,
"direction" : 1
}).count()
как итог запрос выполняется более 1 минуты, запрос идет сугубо по индексу
В чем может быть проблема
80м посчитать в любом случае будет не очень быстро. Попробуйте в fins добавить проекцию {_id: 0, user_id:1, bot_id: 1, direction: 1}
Плюс в вашем случае direction как префикс индекса или после user_id может быть эффективнее, сразу урезав количество ключей для сканирования
yopp
Но наиболее эффективный способ отказаться от схемы 1 сообщение 1 документ
Artem
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
Но в любом случае, сканировать десятки миллионов ключей будет дорого
yopp
В любой базе
Павел 💻
Всем привет! Подскажите пожалуйста, когда выбираем mongoDb , а когда Mysql?
Nick
Всем привет! Подскажите пожалуйста, когда выбираем mongoDb , а когда Mysql?
судя по вопросу,то знаний монги скорее всего крайне мало, либо мало знаний по мускулю, и ответ для вас будет следующий:
когда куча времени и желания что-то новое изучить - то то что не знаешь, когда надо быстро срочно и желательно вчера, то то что уже знаешь
если ожидаете увидеть портянку преимуществ - то это можно загуглить, всеравно все сводится к наличию спецов в команде
Павел 💻
Павел 💻
И ПЕРСПЕКТИВНЕЕ
Nick
лучше в данном случае выбрать примерно контору где хотите работать и узнать ее стек технологий, SQL или NoSQL там и с этого начинать.
А если для себя, то начните с монги - она проще в освоении, если уже умеешь в js - много актуальных материалов в сети. Простой старт, разберешься с концепцией хранения данных вне приложения. Как освоишься, то надо обязательно пощупать mysql - чтобы иметь понимание что есть что и разобраться в синтаксисе SQL - посмотрите на мир данных с другой стороны.
Vladimir
Vladimir
Nick
сложно, но можно) пластелин, лепи что хочешь
Vladimir
Ну просто если очень надо вот это все, то мускуль, скорее всего, подойдёт больше и будет проще, чём из пластилина все это лепить :)
Yaroslav
вот это вот все - можно детальнее?
транзакции действительно иногда нужны (хотя не стоит злоупотреблять), foreign key - зачем?
в монге документная модель, лепить форейн кеями зависимости при правильном подходе как раз и не нужно.
Vladimir
Vladimir
Yaroslav
целостность в монге обеспечивается тем, что все зависимости, которые в реляционных БД вы поддерживали через foreign key, вы храните в одном документе.
это конечно не в 100% случаев возможно, но в целом это то, что соответсвует "философии" монги.
ну и денормализация да, в монге нормальный подход.
честно, за 4 года на монге потребности в foreign key не возникало. в транзакциях иногда, но после перехода на микроснервисы и транзакции нужны нечасто.
Artem
было очень полезно
Ruslan
TypeError: Cannot read property 'collection' of null
Ruslan
Почему данная ошибка если я коллекцию создал?
Nick
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
в случае варианта со статусом будет добавление в индекс, а не переиндексация, не путайте
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
Доброе утро
Что-то у меня не получается понять куда надо добавить в селект это(
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
Из курсора соберите массив и обратывайте как хотите
Гена
Знать бы как это делать...что мне погуглить чтоб вас не дёргать?
Nick
Гена
ну ок..
Гена
спасибо
Dmitriy
Я вам вчера ещё сказал, распрарсите ответ на баше) и не теряйте времени)
Dmitriy
Там все 3 пункта, что я вам вчера описывал на баше простенький скрипт
Гена
Fenicu
Добрый день, не пойму как сформировать запрос, чтобы произошла сортировка по количеству элементов в списке, делаю так
{ "like": {"$gt": 0} }
но он просто по значению выдаёт результат и не сортирует по количеству элементов
Dmitriy
количество элементов у вас существует как отдельное поле со скаляром типа int например или вы хотите вычислить количество элементов, например, в массиве на лету?
Fenicu
у меня документы типа
"_id" : some id,
"like": array of int
Fenicu
и вот нужно подсчитать количество элементов внутри like и выдать сортировку
Dmitriy
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
Dmitriy
если не знаний не понимания нет, то и разницы нет))))
Гена
Коллеги, подскажите, можно ли в монго найти информацию о текущих сессиях?
Откуда они идут и к какой бд
Гена
монга в3.4
yopp
https://docs.mongodb.com/manual/reference/method/db.currentOp/
Гена
есть какой-то другой способ?
Dmitriy
Гена
у нас вот 500 открытых сессий, как узнать сколько к какой базе относятся ?
Гена
))) ну мы так не можем конечно же)) но очень странно что у монги нет такого функицонала. ИЛи я не вижу
каррентОП показывает текущий запрос, а список сессий не могу найти
Гена
листсешшн есть тольк от 3.6 версии