Ilya
мне помогла установка connectTimeoutMS
Игорь
9Гб на диске?
База занимает 9, да
yopp
Это неверный метод оценки. Смотреть необходимо на collStats, на сумму size и indexSizes. https://docs.mongodb.com/manual/reference/command/collStats/#collStats.size
yopp
WT в кэше хранит некомпенсированные страницы
yopp
Если у вас хорошо сжимающиеся данные, на working set может потребоваться существенно больше памяти. По поводу «висящих» соединений. Используйте возможности маркировки курсоров https://docs.mongodb.com/manual/reference/method/cursor.comment/ Например, добавляйте туда точку вызова. Дальше через currentOp у вас будет возможность идентифицировать где в вашем приложении «текут» курсоры.
yopp
В остальном, если вы уже сталкивайтесь с нехваткой памяти, вам необходимо масштабироваться.
yopp
Даже если вы устраните текущие курсоры, это практически не повлияет на объём используемой памяти.
yopp
Если вас беспокоят цифры, то это повод перестать беспокоиться. Современные базы данных стараются максимально использовать оперативную память под свои нужды.
yopp
Внедрите средства контроля и следите за latency и количеством запросов по типу операций . Все остальные метрики имеют смысл только когда вы ищите проблемы, которые будут видны по росту latency.
Игорь
я просто к тому, что при удельном весе всей базы в 9, оперативы в итоге уходит 29. Я правильно понимаю, что монго таким образом может кешировать запросы или какие-то еще операции?
yopp
Она ничего не значит
Vasiliy
ребяты, подскажите пожалуйста как в group: ... sum: '$column_name' приводить $column_name к числу?
Nick
Приводить к числу? Вы строки суммируете?
AstraSerg
ребяты, подскажите пожалуйста как в group: ... sum: '$column_name' приводить $column_name к числу?
первая ссыль в гугле https://stackoverflow.com/questions/29487351/how-to-convert-string-to-numerical-values-in-mongodb :)
Vasiliy
мне т конвертить в aggregation а не приводить к числу
Vasiliy
но в строках числа
Vasiliy
у меня в бд есть значение value, где может быть строка или число (-1, 0, "1235) я сохраняю как есть код на рубях, но понятно должно быть .aggregate([{'$match': {id: 2234}}, {'$group': {_id: '$id', value: { '$sum': '$value'}}}]) (вообще надо последнюю запись выбрать, но пока хочу хотя бы со всеми сделать) хочу на выходе получить сумму всех value как число, не зависимо от типа value
Nick
Если монга 4 версии то можно использовать https://docs.mongodb.com/manual/reference/operator/aggregation/toInt/
Vasiliy
а чего, как гуглил?
AstraSerg
а чего, как гуглил?
https://www.google.com/search?newwindow=1&client=ubuntu&hs=Frg&channel=fs&q=mongodb+string+to+int&spell=1&sa=X&ved=0ahUKEwjy6_2jrdjcAhUEQpoKHdQODKIQBQgmKAA&biw=1080&bih=1817
Vasiliy
хм, я думал в aggregation как-то по особенному
Vasiliy
тэкс, оказалось что то что мне нужно это $last
Vasiliy
слушайте, а какой порядок у полей по дефолту? .aggregate([{ '$match': { key: 2234 } }, { '$sort': { _id: -1 } }, { '$group': { _id: '$key', value: { '$first': '$value' } } }]) делаю так, всё ок, но очень медленно возвращается результат делаю так вот .aggregate([{'$match': {key: 2234}}, {'$group': {_id: '$key', value: { '$last': '$value'}}}]) очень быстро, но чёт смущает что может быть порядок не верный и как можно всю last строку вернуть, а не только одно поле?
AstraSerg
тэкс, оказалось что то что мне нужно это $last
обратите внимание, что он имеет смысл только если отсортировано
Vasiliy
отсортировано - значит sort в aggregation применен?
AstraSerg
отсортировано - значит sort в aggregation применен?
да, конечно. Иначе порядок не гарантирован
Vasiliy
а, вон как, а то у меня без сорта очень быстро проходит и результат даже одинаковый
Vasiliy
чем с сортом
Vasiliy
а как-нибудь sort можно ускорить? там sort по _id, я в монге новый человек, на _id по дефолту нет индекса?
AstraSerg
> и как можно всю last строку вернуть, а не только одно поле? Для этого нужно в $group добавить все нужные поля
AstraSerg
а как-нибудь sort можно ускорить? там sort по _id, я в монге новый человек, на _id по дефолту нет индекса?
Индекс есть, только прямой, попробуйте отсортировать '$sort': { _id: 1 } и взять не $last а $first
AstraSerg
грустно
Это ж логично. Чё грустить?
Vasiliy
ну у меня есть отчеты по сессиям в монге для пользователей
Vasiliy
мне бы хотелось взять для всех пользователей по последнему отчету
Vasiliy
в принципе такое { '$sort': { created_at: -1 } } быстрее чем по _id
AstraSerg
вот смотрите: у вас пользователь Вася, скажем. Записи о нём: Вася - 2018-06-06, Вася - 2018-06-07, 2018-06-08. Вы группируете по пользователю, значит первое поле будет Вася. А какую дату взять во второе поле? Максимальную? минимальную? Среднюю? Это за вас никто не решит
AstraSerg
в принципе такое { '$sort': { created_at: -1 } } быстрее чем по _id
У вас какие индексы на коллекции? db.<имя коллекции>.getIndexes()
Bro
для сорта нужен индекс на поле
Bro
если большая база
Bro
сорт кстати по _id можно делать насколько я помню
AstraSerg
для сорта нужен индекс на поле
Ага, можно конечно и без индекса, если ресурсов не жалко :) и порядок важен. Вот здесь можно почитать: https://docs.mongodb.com/manual/indexes/
Bro
монговский ид же тоже со временем
Bro
и можно его сортировать
Vasiliy
сорт кстати по _id можно делать насколько я помню
так оно медленно в данном случае
Vasiliy
10 сек против сотых
Vasiliy
на created_at индекса нет
AstraSerg
а сколько документов в коллекции?
Vasiliy
261244
Bro
фигня
Bro
у меня вот щаз на одной коллекции не влезает результат
AstraSerg
261244
не так что бы много, но имеет смысл сделать индекс. Только почитайте сначала про индексы, что бы сделать такой, который будет использоваться на максимальном количестве запросов
Vasiliy
мне больше интересно почему сорт по _id так медленно работает
Vasiliy
и не будет ли тормозов когда добавлю индекс на created_at
AstraSerg
и не будет ли тормозов когда добавлю индекс на created_at
Тормозов на чтение увеличиться не может. На запись - увеличится, но принебрежительно мало
Bro
а что реально сортировка по _id медленнее индекса по времени работает?
Vasiliy
на поле времени нет индекса
Vasiliy
ну вот c { '$sort': { created_at: -1 } } - SUCCEEDED | 0.02214646s c { '$sort': { _id: -1 } } - SUCCEEDED | 10.304851694s
AstraSerg
ну вот c { '$sort': { created_at: -1 } } - SUCCEEDED | 0.02214646s c { '$sort': { _id: -1 } } - SUCCEEDED | 10.304851694s
если -1, то индекс использоваться не будет. Проверьте с { '$sort': { _id: 1 } }
Vasiliy
3 секунды
Vasiliy
в среднем
Vasiliy
но created_at даже без индекса быстрее _id
AstraSerg
но created_at даже без индекса быстрее _id
Это странно... Можно попробовать поковырять explain https://docs.mongodb.com/manual/reference/operator/meta/explain/
AstraSerg
может что-то проясниться...
Vasiliy
ну кстати
Vasiliy
добавил индекс на поле created_at и сорт начал тормозить
Vasiliy
explain говорит что sort если на нем нет индекса вообще не участвует
AstraSerg
explain говорит что sort если на нем нет индекса вообще не участвует
Вам нужно сделать такой индекс, который будет использоваться при сортировке. Важно, что бы совпадал набор полей, по которым будет сортировка и направление 1 или -1
Vasiliy
ну я его делаю db.collection_name.createIndex({'created_at': 1}) добавляю потом в агрегацию { '$sort': { created_at: 1 } } и работает дольше на 3 сек чем без индекса
Vasiliy
стейджи?