2016-10-20 2 views
1

У меня есть коллекция как этот. Огромный объем данных, ~ 8 ГБMongodb агрегация в двух измерениях

> db.collector.find({},{'first':1,srcport: true,dstport:true,dOctets:true,_id:0}).skip(1682000) 
{ "dstport" : 34760, "dOctets" : 104, "first" : NumberLong("1476941688344"), "srcport" : 443 } 
{ "dstport" : 443, "dOctets" : 104, "first" : NumberLong("1476941689944"), "srcport" : 59326 } 
{ "dstport" : 59326, "dOctets" : 104, "first" : NumberLong("1476941690034"), "srcport" : 443 } 
{ "dstport" : 5222, "dOctets" : 164, "first" : NumberLong("1476941698934"), "srcport" : 58918 } 
{ "dstport" : 443, "dOctets" : 92, "first" : NumberLong("1476941698974"), "srcport" : 42704 } 
{ "dstport" : 443, "dOctets" : 116, "first" : NumberLong("1476941698974"), "srcport" : 34716 } 
{ "dstport" : 34716, "dOctets" : 104, "first" : NumberLong("1476941698984"), "srcport" : 443 } 
{ "dstport" : 42704, "dOctets" : 80, "first" : NumberLong("1476941698984"), "srcport" : 443 } 
{ "dstport" : 58918, "dOctets" : 104, "first" : NumberLong("1476941699024"), "srcport" : 5222 } 
{ "dstport" : 123, "dOctets" : 152, "first" : NumberLong("1476941699244"), "srcport" : 123 } 
{ "dstport" : 123, "dOctets" : 152, "first" : NumberLong("1476941699294"), "srcport" : 123 } 
{ "dstport" : 54526, "dOctets" : 394, "first" : NumberLong("1476941700394"), "srcport" : 3389 } 
{ "dstport" : 3389, "dOctets" : 104, "first" : NumberLong("1476941700394"), "srcport" : 54526 } 
{ "dstport" : 123, "dOctets" : 152, "first" : NumberLong("1476941701254"), "srcport" : 123 } 
{ "dstport" : 5678, "dOctets" : 402, "first" : NumberLong("1476941703414"), "srcport" : 39926 } 
{ "dstport" : 5678, "dOctets" : 268, "first" : NumberLong("1476941703414"), "srcport" : 39926 } 
{ "dstport" : 5678, "dOctets" : 399, "first" : NumberLong("1476941703414"), "srcport" : 46336 } 
{ "dstport" : 5678, "dOctets" : 266, "first" : NumberLong("1476941703414"), "srcport" : 46336 } 
{ "dstport" : 5678, "dOctets" : 381, "first" : NumberLong("1476941703414"), "srcport" : 46575 } 
{ "dstport" : 5678, "dOctets" : 387, "first" : NumberLong("1476941703414"), "srcport" : 46845 } 

Я хочу получить верхнюю статистику.

0) матч

{'$match': { 
        first: { 
        '$gte':startdate, 
        '$lte':stopdate}, 
       }} 

1) группа по dstport и суммы dOctets

'$group': {_id: { port:"$dstport"... 

2) группы по srcport и просуммировать dOctets

'$group': {_id: { port:"$srcport"... 

3) присоединиться к 1,2 группы

4) группа по _id.port и суммам сумм

5) вида и ограничить

Результат я хочу обязательно выглядит

[{port:443, inOctets:123456, outOctets:321654, sum: 445110}... 

Я попытался с агрегационным трубопроводом, но нет никакого способа, чтобы вилка в двух группах.

Могу ли я сделать это без временного сбора?

ответ

1

MongoDB 3.4 поддержка $ facet, это означает создание нескольких пространств, где вы можете вычислить изолированный запрос (например, 2 типа группы).

Обеспечивает возможность обработки нескольких трубопроводов на входных документов и выдает документ, содержащий результаты этих трубопроводов

https://docs.mongodb.com/master/release-notes/3.4-reference/#pipe._S_facet

+0

я вижу 3,4 предоставляет много интересных скоплений! – eri

+0

@eri я отвечу на вопрос? –

+0

перед выпуском 3.4 я все еще ищу обходное решение .. – eri