Снижение агрегации (или объединение результатов двух агрегаций) - PullRequest
0 голосов
/ 16 апреля 2019

Я получил огромную коллекцию событий связи между двумя платформами.Для целей мониторинга каждую минуту я генерирую статистику для временного сбора статистики.Мне нужно сделать агрегацию менее детальной, что слишком сложно для меня сделать с одним запросом.См. Следующий запрос:

var today = new Date();
var offset = today.getTimezoneOffset();
var now = new Date(today.getTime()+(-offset)*60*1000);
var today1 = today.getTime()+(-offset)*60*1000-6*1000*60;
var sec =  1000 * 60  ;
var start = new Date(Math.round(today1 / sec) * sec + 59999);
var end = new Date(Math.round(today1 / sec) * sec )
db.events.aggregate([
{$project: {_id: 0, time: 1, is_request: 1, dst: 1,src: 1,"Result-Code": {$ifNull: [ "$Result-Code", "0" ]} , RC: { $substr: [ "$Result-Code", 0, 1 ] } , "CC-Request-Type": 1 }},
{$match: {"time": { "$lte": start, "$gte": end} }} ,
{$group: {_id: {is_request: "$is_request" ,dst: "$dst",src: "$src",
  "CC-Request-Type": "$CC-Request-Type",
  "RC": "$RC"},
           count: {$sum: 1}}}
         // {$out: "stats"} 
]);

первые 7 строк предназначены для расчета минутного периода (0-59 с) 6 минут назад, а агрегирование - для генерации статистики трафика.Агрегация возвращает следующие документы:

{
    "_id" : {
        "is_request" : 1,
        "dst" : "10.12.0.2",
        "src" : "10.11.0.1",
        "CC-Request-Type" : 3,
        "RC" : ""
    },
    "count" : 1.0
}

/* 11 */
{
    "_id" : {
        "is_request" : 1,
        "dst" : "10.12.0.3",
        "src" : "10.11.0.2",
        "CC-Request-Type" : 2,
        "RC" : ""
    },
    "count" : 38.0
}

/* 12 */
{
    "_id" : {
        "is_request" : 0,
        "dst" : "10.11.0.3",
        "src" : "10.12.0.2",
        "CC-Request-Type" : 2,
        "RC" : "2"
    },
    "count" : 1.0
}

/* 13 */
{
    "_id" : {
        "is_request" : 0,
        "dst" : "10.11.0.2",
        "src" : "10.12.0.9",
        "CC-Request-Type" : 1,
        "RC" : "4"
    },
    "count" : 1.0
}

Существует 6 адресов SRC и 4 DST.Я знаю, что простым способом я могу получить результаты по двум запросам, но мне это нужно одновременно для сбора статистики.Мне интересно, есть ли способ агрегирования с ОДНЫМ запросом для достижения следующего:

{
    "_id" : {
        "is_request" : 1,
        "dst" : "10.12.0.2",      
        "CC-Request-Type" : 3,
        "RC" : ""
    },
    "count" : 1.0    (all src addresses)
}

/* 11 */
{
    "_id" : {
        "is_request" : 1,
        "dst" : "10.12.0.3",   
        "CC-Request-Type" : 2,
        "RC" : ""
    },
    "count" : 38.0     (all src addresses)
}

/* 12 */
{
    "_id" : {
        "is_request" : 0,
        "src" : "10.12.0.2", 
        "CC-Request-Type" : 2,
        "RC" : "2"
    },
    "count" : 1.0     (all dst addresses)
}

/* 13 */
{
    "_id" : {
        "is_request" : 0,
        "src" : "10.12.0.9", 
        "CC-Request-Type" : 1,
        "RC" : "4"
    },
    "count" : 1.0    (all dst addresses)
}
...