Viktor
очень медленно работает
Viktor
хотя БД всего 600 метров
yopp
stage:"COLLSCAN" вам нужно добавить индекс который покроет shape запроса
yopp
а, у вас nReturned:2541036 == docsExamined:2541036
yopp
600мб за 2 секунды это неплохой результат
Viktor
Anonymous
@dd_bb попробовал агрегацию, в случае с тоталом по месяцам, сработало отлично, еще раз спасибо. сейчас мой другой mapReduce выдает выдает такой результат, т.е. у меня в один день собираются разные типы со всех заказов для одного дня + их тотал - в случае с агрегацией это решается несколькими stage $match + stage $group или есть вариант проще и я что-то упускаю, или это действительно нестадартный usecase и лучше в таком случае остаться с mapReduce ? Сорри за наглость, это мой последний вопрос, дальше буду рыть сам { "type_1": 1, "total": 1, "date": "2020-04-12T00:00:00.000Z" }, { "type_1": 13, "type_2": 83, "type_3": 70, "total": 166, "date": "2020-04-11T00:00:00.000Z" }, { "date": "2020-04-10T00:00:00.000Z" },
yopp
сначала группировать по $date, $type
yopp
а потом ещё раз сгрупировать по $date сделав $push по $type
yopp
и потом опцинально $arrayToObject
yopp
вот так как-то
yopp
@mesmerizi https://play.db-ai.co/m/XpcRW4OtowAByoa2
Anonymous
больше спасибо, вникаю, пробую
yopp
там можно было бы без $map внутри $arrayToObject обойтись, но я чот сходу не придумал как $push заставить не документ, а массив в массив добавлять
yopp
чтоб оно делало сразу пары types: [[type, subtotal], … ]
Anonymous
чтоб оно делало сразу пары types: [[type, subtotal], … ]
pure magic, works like a charm! 🙏🙏🙏 спасибо
Konstantin
@dd_bb
Vladimir
Всем привет. У кого-нибудь есть предположения, почему ObjectId.toString() возвращает всё равно ObjectId? db.getCollection("users").aggregate([ {$project : {idstr : "$_id".toString()}} ]);
Vladimir
Использовать $toString не могу, версия монги меньше 4.0
yopp
Всем привет. У кого-нибудь есть предположения, почему ObjectId.toString() возвращает всё равно ObjectId? db.getCollection("users").aggregate([ {$project : {idstr : "$_id".toString()}} ]);
Вы вызываете метод toString на строке "$_id" на клиенте, а не в монге. Трансформируйте результаты вызова aggregate()
yopp
А, в этом случае скорее всего никак. А почему именно строка нужна?
Vladimir
А, в этом случае скорее всего никак. А почему именно строка нужна?
Это будут значения для фильтра, который имеет тип String, т.к. с ObjectId там какие-то проблемы. Думал, что будет проще к строке привести и работать с ней
Vladimir
Не. Это в Jasperserver. Для отчётности. Там можно сделать фильтр со списком значений, а потом выбранное значение передавать в запрос. Но джаспер с objectid я подружить не смог, хотя отдельный тип под него есть. В итоге сделал по другому полю)
Anonymous
Добрый день) Подскажите, насколько легко/сложно справится монго-кластер 2х2 с 500 апдейтами в секунду на дкоументах меннее 500кб, количеством около 7кк И какие есть гуд практис Спасиб
yopp
2x2 это какая топология? В цифрах «хорошо/плохо» как выражается? 500 в секунду это постоянная нагрузка или пиковая? В целом, это зависит от того какое условие для поиска документов для обновления, сколько в итоге надо обновить документов и как. 7 млн документов по <500кб это уже до 4тб без учёта того насколько хорошо документы сжимаются. <500кб по 500 раз в секунду это до ~~250мб/с, без учёта компрессии и обновления индексов в одну сторону. Будет зависеть от множества факторов, но в первую очередь от ширины шины, пропускной способности и задержек хранилища под тем партерном нагрузили который выйдет. Если будут обновляться примерно один и те-же документы на чтение нагрузка будет меньше. Но «максимальный размер» не очень хорошая метрика, которая позволит прикинуть не очень реалистичные цифры «верхнего предела». лучше ориентироваться на «медианный» размер. Самый надёжный способ — сделать тестовый стол и на нём проверить на реальных данных или на данных максимально приближенных к реальным
Anonymous
2x2 это какая топология? В цифрах «хорошо/плохо» как выражается? 500 в секунду это постоянная нагрузка или пиковая? В целом, это зависит от того какое условие для поиска документов для обновления, сколько в итоге надо обновить документов и как. 7 млн документов по <500кб это уже до 4тб без учёта того насколько хорошо документы сжимаются. <500кб по 500 раз в секунду это до ~~250мб/с, без учёта компрессии и обновления индексов в одну сторону. Будет зависеть от множества факторов, но в первую очередь от ширины шины, пропускной способности и задержек хранилища под тем партерном нагрузили который выйдет. Если будут обновляться примерно один и те-же документы на чтение нагрузка будет меньше. Но «максимальный размер» не очень хорошая метрика, которая позволит прикинуть не очень реалистичные цифры «верхнего предела». лучше ориентироваться на «медианный» размер. Самый надёжный способ — сделать тестовый стол и на нём проверить на реальных данных или на данных максимально приближенных к реальным
2 шарда по 2 реплики 500 - постоянная нагрузка 500 кб - максимальный размер документа я сейчас тестирую индексы, но почему-то результат выполнения не зависит от плана, то есть что collscan, что index sacn работоают одинаково не быстро
yopp
explain(executionStats:1) на index scan что показывает?
yopp
а что в документах и какая логика обновления? 500 документов одинаковых или разных?
Anonymous
explain(executionStats:1) на index scan что показывает?
ну тут прям полотно) что конкретно скинуть ?)
yopp
куда-то на gist.github.com залейте
Anonymous
куда-то на gist.github.com залейте
https://gist.github.com/bespilotnayakartoshka/7b9a936dbb8aa6ed9bc24fe53f73cbef
yopp
"stage" : "IXSCAN", "nReturned" : 449022
yopp
это на три порядка больше чем 500 документов :)
yopp
keysExamined" : 449023, намекает что в условие попадает вся коллекция
Anonymous
это на три порядка больше чем 500 документов :)
а я не говорил, что будет 500 доокументов) у меня будет 500 операций в секунду над документами
Anonymous
этот запрос еще вроде сойдет, могу скинуть посложнее, он выполняется 5 секунд
yopp
под вашу задачу скорее всего необходимо поменять схему
yopp
а что за вложенные циферки?
Anonymous
а что за вложенные циферки?
ну, например активность у меня есть активность по дням { id: 1, activnots: [ { date: 2019-01-01, metrika1: 100, metrika2: 300 }
yopp
и её надо обновлять у какого количества документов?
Anonymous
и её надо обновлять у какого количества документов?
слишком depends думаю около 30% всех документов будут инкрементить в себе какую-либо метрику за текущий день
yopp
500 раз в секунду?
Anonymous
да, +-
Anonymous
500 раз в секунду?
ну то есть как есть Х документов и есть 500 действий мне нужно совершить 500 дейтсвий над каждым документом (каждое действие - один конкретный документ)
yopp
30% документов 500 раз в секунду это в худшем случае 150х всего объёма данных, что в худшем случае эквивалентно 7кк*500кб*150 = 500Тб/сек
yopp
да, я понимаю
Anonymous
а что за 500 действий?
например, пользователь пробежал 100 метров
Anonymous
таких пользователей овероверовермного, и трекается какая-то метрика таких метрик приходит штук по 500 в секунду из-за большого количества пользователей
yopp
например, пользователь пробежал 100 метров
т.е. обновляется 1 документ в итоге?
Anonymous
т.е. обновляется 1 документ в итоге?
да, я там выше исправил как это должно работать) каждая метрика - обновляет конкретный документ то есть в худшем случае 500 уникальных обновлений в секунду
yopp
это уже лучше
Anonymous
^ а это тогда что такое?
это я делал предварительный селект по кретерию cn и стране
yopp
а что такое «предварительный селект»?
Anonymous
а что такое «предварительный селект»?
я хочу получить статистику, анпример, по пользователям из страны А, что он прошел за Х дней больше У метров
yopp
так, это уже другая задача :)
yopp
с обновлениями давайте подведём итог
Anonymous
и такого плана запросы работают намного дольше, чем просто получить пользователей из страны А
yopp
TL;DR: если у вас селектор в запросе позволяет найти обновляемый документ за keysExamined ~~ 1, то проблем не будет
yopp
особенно если это простой $inc
yopp
теперь про статистику
yopp
расскажите, как у вас устроены документы?
Anonymous
ну, например активность у меня есть активность по дням { id: 1, activnots: [ { date: 2019-01-01, metrika1: 100, metrika2: 300 }
вот так, это основная метрика там есть еще high-level поля, но они простые, просто сеты интов/строк
yopp
activnots какое количество дней содержит?
Anonymous
activnots какое количество дней содержит?
это я так назвал на ходу его) содержит от 0 до 1000 элементов
yopp
ага, получается у вас есть 7 млн пользователей, у каждого хранится история с временным разрешением в день, с глубиной до 1000 дней, где хранится до 500 метрик?
yopp
ага
yopp
я вижу тут несколько проблем
yopp
если ваша аналитика привязана ко времени, то храненей всей истории в одном документе не даёт возможности уменьшить объём данных
yopp
как следствие чтоб посчитать например сколько всего пробежали пользователи, нужно будет проверить все документы
yopp
вторая проблема что все метрики хранятся тоже в одном документе