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
@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
@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"
},
https://play.db-ai.co/m/XpcO3wbYvgABFUY4
yopp
вот так как-то
yopp
@mesmerizi https://play.db-ai.co/m/XpcRW4OtowAByoa2
Anonymous
больше спасибо, вникаю, пробую
yopp
там можно было бы без $map внутри $arrayToObject обойтись, но я чот сходу не придумал как $push заставить не документ, а массив в массив добавлять
yopp
чтоб оно делало сразу пары types: [[type, subtotal], … ]
Anonymous
Konstantin
@dd_bb
Vladimir
Всем привет. У кого-нибудь есть предположения, почему ObjectId.toString() возвращает всё равно ObjectId?
db.getCollection("users").aggregate([
{$project : {idstr : "$_id".toString()}}
]);
Vladimir
Использовать $toString не могу, версия монги меньше 4.0
yopp
Vladimir
yopp
А, в этом случае скорее всего никак. А почему именно строка нужна?
yopp
Vladimir
Не. Это в Jasperserver. Для отчётности. Там можно сделать фильтр со списком значений, а потом выбранное значение передавать в запрос. Но джаспер с objectid я подружить не смог, хотя отдельный тип под него есть. В итоге сделал по другому полю)
Anonymous
Добрый день)
Подскажите, насколько легко/сложно справится монго-кластер 2х2 с 500 апдейтами в секунду на дкоументах меннее 500кб, количеством около 7кк
И какие есть гуд практис
Спасиб
Anonymous
yopp
explain(executionStats:1) на index scan что показывает?
yopp
а что в документах и какая логика обновления? 500 документов одинаковых или разных?
Anonymous
yopp
куда-то на gist.github.com залейте
Anonymous
yopp
"stage" : "IXSCAN",
"nReturned" : 449022
yopp
это на три порядка больше чем 500 документов :)
yopp
keysExamined" : 449023,
намекает что в условие попадает вся коллекция
Anonymous
этот запрос еще вроде сойдет, могу скинуть посложнее, он выполняется 5 секунд
yopp
под вашу задачу скорее всего необходимо поменять схему
yopp
а что за вложенные циферки?
Anonymous
а что за вложенные циферки?
ну, например активность
у меня есть активность по дням
{
id: 1,
activnots: [
{
date: 2019-01-01,
metrika1: 100,
metrika2: 300
}
yopp
и её надо обновлять у какого количества документов?
yopp
500 раз в секунду?
Anonymous
да, +-
Anonymous
500 раз в секунду?
ну то есть как
есть Х документов
и есть 500 действий
мне нужно совершить 500 дейтсвий над каждым документом (каждое действие - один конкретный документ)
yopp
30% документов 500 раз в секунду это в худшем случае 150х всего объёма данных, что в худшем случае эквивалентно 7кк*500кб*150 = 500Тб/сек
yopp
Anonymous
yopp
да, я понимаю
Anonymous
таких пользователей овероверовермного, и трекается какая-то метрика
таких метрик приходит штук по 500 в секунду из-за большого количества пользователей
yopp
Anonymous
т.е. обновляется 1 документ в итоге?
да, я там выше исправил как это должно работать)
каждая метрика - обновляет конкретный документ
то есть в худшем случае 500 уникальных обновлений в секунду
yopp
это уже лучше
yopp
yopp
а что такое «предварительный селект»?
yopp
так, это уже другая задача :)
yopp
с обновлениями давайте подведём итог
Anonymous
и такого плана запросы работают намного дольше, чем просто получить пользователей из страны А
Anonymous
yopp
TL;DR: если у вас селектор в запросе позволяет найти обновляемый документ за keysExamined ~~ 1, то проблем не будет
yopp
особенно если это простой $inc
yopp
теперь про статистику
yopp
расскажите, как у вас устроены документы?
Anonymous
yopp
activnots какое количество дней содержит?
yopp
ага, получается у вас есть 7 млн пользователей, у каждого хранится история с временным разрешением в день, с глубиной до 1000 дней, где хранится до 500 метрик?
Anonymous
yopp
ага
yopp
я вижу тут несколько проблем
yopp
если ваша аналитика привязана ко времени, то храненей всей истории в одном документе не даёт возможности уменьшить объём данных
yopp
как следствие чтоб посчитать например сколько всего пробежали пользователи, нужно будет проверить все документы
yopp
вторая проблема что все метрики хранятся тоже в одном документе