
AstraSerg
10.08.2018
08:22:50
@vasivas
> ...как пофиксить это?
в индексе вы можете задать порядок сортировки при создании. Это 1 или -1. Он должен соответствовать запросу. Но, на сколько я помню, мы с вами пришли к выводу, что индекс правиьлный, так как find-е работает, а в агрегации - нет.

Vasiliy
10.08.2018
08:24:42
ну порядок там роли не играет
одинаково долго
я и с тем и с другим пробовал

Google

Vasiliy
10.08.2018
08:25:10
пользы от этого нет

AstraSerg
10.08.2018
08:25:56
а, у вас там ещё размер одного из полей был большой

Vasiliy
10.08.2018
08:26:52
видно же что когда инжекс для сортировки не используется то оно правильно задаёт границы
"indexBounds" : {
"rig_session_id" : [
"[2234.0, 2234.0]",
"[2255.0, 2255.0]"
]
}
а если индекс участвует в сортировке то вот так
"indexBounds" : {
"_id" : [
"[MinKey, MaxKey]"
]
}

AstraSerg
10.08.2018
08:29:05
так в первом копипасте всего 2 документа уже на этот стейдж приходит

Vasiliy
10.08.2018
08:39:18
именно, а запрос отличается просто наличием индекса на created_at
{'$sort': {created_at: 1}}

AstraSerg
10.08.2018
08:41:29

Vasiliy
10.08.2018
09:18:39
что-то типа такого https://pastebin.com/aCdMq7fK
вот запрос
db.reports.aggregate([{ $match : { rig_session_id : { $in : [2234, 2255 ] } } },{'$sort': {created_at: 1}}, { $group : { _id : '$rig_session_id', hashrate: { $last : '$$ROOT' } } }])

AstraSerg
10.08.2018
09:24:10

Vasiliy
10.08.2018
09:25:48
"miner_log": "==",
"os_log": "",
я до сих пор не понимаю при чем они тут, потому что explain явно говорит что в случае с индексом indexBound берет диапазон от minKey до maxKey, а без него нормально работает с rig_session_id

AstraSerg
10.08.2018
09:26:02

Vasiliy
10.08.2018
09:26:09
строка
"created_at": "2018-08-03T18:02:04.508732Z",

Google

AstraSerg
10.08.2018
09:27:13
Ок, буду у компа через час, попробую на стенде

Vasiliy
10.08.2018
09:33:57
вообще
если в sort добавить rig_session_id(который в match участвует) то время существенно сокращается
могу скинуть executionStatus
походу понял
надо обязательно в match указывать параметры для поля которое будет в sort если оно индексовое
иначе оно границы сортировки по индексовому полю берет от мин до макс, а если в матч условие есть то границы из этого поля

AstraSerg
10.08.2018
10:07:31
ОЧЕНЬ ЛЕГКО ДА
Вообще, да, не сложно. Только попрактиковаться немного. После этого разбирательства вы сильно продвинитесь.

Vasiliy
10.08.2018
10:49:41
ребят а как лучше делать, при наличии такого же индекса как в сортировке - сортировать -1 и потом в гроуп брать $first или сортировать 1 и в группировке брать $last?

AstraSerg
10.08.2018
11:07:29

Vasiliy
10.08.2018
11:08:46
да, спасибо большое за отзывчивость, просто надо было индексное поле по которому сортируется добавить в match

AstraSerg
10.08.2018
11:11:59

Vasiliy
10.08.2018
11:15:54
у нас только часть с отчётами в монге, остальное постгре
а можете ссылку кинуть?

Игорь
10.08.2018
11:30:53
Вопрос. Настроил ротацию логов через logrotate.d
конфиг
/var/log/mongodb/*.log {
daily
rotate 30
compress
dateext
missingok
notifempty
sharedscripts
postrotate
/bin/kill -SIGUSR1 `cat /var/lib/mongodb/mongod.lock 2> /dev/null` 2> /dev/null || true
endscript
}
при его запуске монго падает

Google

Stanislav
10.08.2018
11:48:51
Может кто-нибудь знает, есть ли какие-то книги/курсы по бигдате в монге? типа, как жить с 100трлн документов и как делать по ним аналитику
есть конечно подозрение, что монга вообще не для этого, но хочется посмотреть на попытки и во что упираются такие системы

AstraSerg
10.08.2018
11:50:13
Предложение типа rm -rf / : запишите туда 1 :))))
только не в проде :)


Joseph
10.08.2018
11:54:39
db.eval((queueId = "5b6cf99c0026bf6c948b3663", operationId = -1, skip = 0) => {
const queueParrent = db.queues
.find({ parent: { $exists: true } })
.populate('document', 'uid')
.sort({ updated: -1 });
var filtred = queueParrent.filter(el => (
String(el.parent.queue) === queueId) &&
(Number(operationId) + 1 === el.parent.operationId));
var statistic = {};
filtred.forEach((el) => {
statistic[el.status] = !statistic[el.status] ? 1 : statistic[el.status] + 1;
});
var lengthSubQueue = filtred.length;
filtred = filtred.slice(skip, skip + 10);
console.log(1111111);
console.log(filtred, lengthSubQueue, statistic);
return { arr: filtred, lengthSubQueue, statistic };
});
Не могу понять почему она ретурнит не значения а саму функцию

Игорь
10.08.2018
11:54:54

AstraSerg
10.08.2018
11:55:17
смотрите: kill принимает 2 параметра: тип сигнала и номер процесса, кому его послать. Номер процесса обычно находится в файле с расширением .pid а у вас .lock почему-то

Игорь
10.08.2018
11:58:03
а вообще просто выставления db.adminCommand( { logRotate : 1 } )
достаточно для ротации логов? Я чет читал, читал, но так и не понял, нужнен ли еще этот самый logrotate.d
или прописав командку в моного будет достаточно

AstraSerg
10.08.2018
11:59:58

AstraSerg
10.08.2018
12:01:55


Joseph
10.08.2018
12:03:01
А точно не выполняется? Может просто выводит что собирается делать?
Вот что это чудо мне возвращает
{
"code": "(queueId, operationId, skip = 0) => {\n const queueParrent = db.queues\n .find({ parent: { $exists: true } })\n .populate('document', 'uid')\n .sort({ updated: -1 });\n let filtred = queueParrent.filter(el => (\n String(el.parent.queue) === queueId) &&\n (Number(operationId) + 1 === el.parent.operationId));\n const statistic = {};\n filtred.forEach((el) => {\n statistic[el.status] = !statistic[el.status] ? 1 : statistic[el.status] + 1;\n });\n const lengthSubQueue = filtred.length;\n filtred = filtred.slice(skip, skip + 10); // 10 - limit\n return { arr: filtred, lengthSubQueue, statistic };\n }"
}
Собственно ее ретурн почему то
?

AstraSerg
10.08.2018
12:12:28
или просто вот это: db.eval( function(x) { return x + x; }, 3 )

Joseph
10.08.2018
12:22:41

AstraSerg
10.08.2018
12:41:17
вот это отработало
А изначальный почему не отрабатывает? Вы его писали или скопипастили где-то?

Google

Joseph
10.08.2018
12:48:37
>Вы его писали или скопипастили где-то?
То что я кинул это моя хранимка

Vasiliy
10.08.2018
12:57:39
так, сегодня я лидирую по вопросам
{ "created_at" : "2018-08-10T12:56:28.758060Z", "rig_session_id" : 2304, "gpus" : { "code" : "....", "temperature" : 57 } }
{ "created_at" : "2018-08-10T12:56:28.758060Z", "rig_session_id" : 2304, "gpus" : { "code" : "GPU-...", "temperature" : "50" } }
...
как мне вытащить code и temperature на уровень выше?
это после unwind стадии

AstraSerg
10.08.2018
13:00:43

Vasiliy
10.08.2018
13:01:31
мне бы желательно чтобы результатом следующего стейджа было
{ "created_at" : "2018-08-10T12:56:28.758060Z", "rig_session_id" : 2304, "code" : "GPU-...", "temperature" : "50" }

AstraSerg
10.08.2018
13:03:41

Admin
ERROR: S client not available

Vasiliy
10.08.2018
13:04:36
так прожект же вроде только контроллирует что показывать а что нет, не?

AstraSerg
10.08.2018
13:06:34
да, ну и название можно другое сделать:
<field>: <expression> Adds a new field or resets the value of an existing field.
https://docs.mongodb.com/manual/reference/operator/aggregation/project/

Vasiliy
10.08.2018
13:06:35
я пока дошёл до такого
db.reports.aggregate([
{$match: {rig_session_id: {$in: [2304, 2255]}, created_at: {$gte: '2018-08-10T10:39:04'}}},
{$sort: {created_at: -1}},
{$group: {_id: '$rig_session_id', last_report: {$first: '$$ROOT'}}},
{$project: {last_report: {created_at: 1, rig_session_id: 1, 'gpus': {code: 1, temperature: 1}}}},
{$replaceRoot: {newRoot: '$last_report'}}, {$unwind: '$gpus'}
]);
а, понял, через $ нотацию
блин, офигенски, так можно же всю логику в тупо запросы вытащить

AstraSerg
10.08.2018
13:13:37
Нп ердпоследнем стейдже вместо
'gpus': {code: 1, temperature: 1}
сделайте:
gpus_code: '$gpus.code', gpus_temperature: '$gpus.temperature'
Поясннения: https://docs.mongodb.com/manual/reference/operator/aggregation/project/#include-computed-fields

Vasiliy
10.08.2018
13:14:21
да, собственно почти так и сделал
{$project: {rig_session_id: 1, code: '$gpus.code', temperature: '$gpus.temperature'}}

AstraSerg
10.08.2018
13:14:51

Google

Joseph
10.08.2018
13:17:53

AstraSerg
10.08.2018
13:18:24

Joseph
10.08.2018
13:18:36

M
10.08.2018
13:37:49
Ребята подскажите а ктото логи mongo собирает и пишет в еластик ?

AstraSerg
10.08.2018
13:45:11

M
10.08.2018
13:47:13

AstraSerg
10.08.2018
13:48:22

M
10.08.2018
13:48:28
вообще задача больше как понимать что происходит с базой , кто и что с ней делает

Vasiliy
10.08.2018
13:49:18

AstraSerg
10.08.2018
13:50:19

Vasiliy
10.08.2018
13:53:04
хотелось бы одним запросом всё достать

AstraSerg
10.08.2018
13:53:52

Vasiliy
10.08.2018
13:54:41
а почему так?

AstraSerg
10.08.2018
14:00:55
а почему так?
На мой взгляд это уже обработка данных, которая не задача БД. Но если настаиваете то можно конвертировать: https://docs.mongodb.com/manual/reference/operator/aggregation/convert/#exp._S_convert

Vasiliy
10.08.2018
14:12:06
у меня 3.6 монга

AstraSerg
10.08.2018
14:19:17

Khramov
10.08.2018
14:38:16
Привет.
У меня к вам вопрос по монге :)
Есть отдельная однонодавая монга и есть replicaset отдельно из 3 нод.
Я на отдельной однонодовой монге заинитил rs, и хочу как-то посинкать данные между ними.
Получается, существующий rs из 3 нод со своим мастером я должен подключить как слейвы к однонодовой.
Подскажите, как правильно это сделать?
Сейчас сижу, читаю доку, но чет тяжело идет

Constantin
10.08.2018
15:05:23
На репликасете из 3 нод уже что-то есть? Или он пока пустой? Остановка базы допускается?

Khramov
10.08.2018
15:11:20
Остановка базы которая из 3 нод да, которая из 1 ноды - желательно нет,это прод, нанадолго можно, если это необходимо
в рс из 3 нод уже есть данные, желательно их сохранить, но если такой возможности нет - данные из однонодовой монги важнее