Я получил огромную коллекцию событий связи между двумя платформами.Для целей мониторинга каждую минуту я генерирую статистику для временного сбора статистики.Мне нужно сделать агрегацию менее детальной, что слишком сложно для меня сделать с одним запросом.См. Следующий запрос:
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)
}