Расщепление результата запроса по дате - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь объединить набор данных в MongoDB для использования в Redash. Я хотел бы разделить агрегированный результат на четыре результата, основываясь на дате, содержащейся в коллекции.

Пример набора данных

{ "_id" : ObjectId("5ca6a9219a6c64190bfbe397"), "threatlevel" : 4, "timestamp" : "1522891861", "devicename" : "abc", "alertsource" : "p1" }
{ "_id" : ObjectId("5ca6a9249a6c64190bfbe3c9"), "threatlevel" : 3, "timestamp" : "1523064661", "devicename" : "acb", "alertsource" : "p1" }
{ "_id" : ObjectId("5ca6a9249a6c64190bfbe3d8"), "threatlevel" : 5, "timestamp" : "1524965461", "devicename" : "bcd", "alertsource" : "wine" }
{ "_id" : ObjectId("5ca6a9249a6c64190bfbe3db"), "threatlevel" : 4, "timestamp" : "1525483861", "devicename" : "abc", "alertsource" : "av" }
{ "_id" : ObjectId("5ca6a9259a6c64190bfbe3e4"), "threatlevel" : 4, "timestamp" : "1525829461", "devicename" : "def", "alertsource" : "av" }
{ "_id" : ObjectId("5ca6a9259a6c64190bfbe3e9"), "threatlevel" : 5, "timestamp" : "1526088661", "devicename" : "bcd", "alertsource" : "wine" }
{ "_id" : ObjectId("5ca6a9239a6c64190bfbe3b7"), "threatlevel" : 2, "timestamp" : "1526520661", "devicename" : "def", "alertsource" : "wine" }
{ "_id" : ObjectId("5ca6a9239a6c64190bfbe3b8"), "threatlevel" : 2, "timestamp" : "1527298261", "devicename" : "def", "alertsource" : "av" }
{ "_id" : ObjectId("5ca6a9239a6c64190bfbe3ba"), "threatlevel" : 1, "timestamp" : "1527816661", "devicename" : "abc", "alertsource" : "wine" }
{ "_id" : ObjectId("5ca6a9239a6c64190bfbe3b9"), "threatlevel" : 1, "timestamp" : "1528335061", "devicename" : "bcd", "alertsource" : "av" }
{ "_id" : ObjectId("5ca6a9269a6c64190bfbe410"), "threatlevel" : 2, "timestamp" : "1528507861", "devicename" : "abc", "alertsource" : "av" }
{ "_id" : ObjectId("5ca6a9259a6c64190bfbe3fe"), "threatlevel" : 2, "timestamp" : "1528939861", "devicename" : "def", "alertsource" : "wine" }
{ "_id" : ObjectId("5ca6a9259a6c64190bfbe3fc"), "threatlevel" : 5, "timestamp" : "1529112661", "devicename" : "abc", "alertsource" : "av" }
{ "_id" : ObjectId("5ca6a9279a6c64190bfbe429"), "threatlevel" : 5, "timestamp" : "1529371861", "devicename" : "def", "alertsource" : "av" }
{ "_id" : ObjectId("5ca6a9279a6c64190bfbe439"), "threatlevel" : 5, "timestamp" : "1530235861", "devicename" : "abc", "alertsource" : "wine" }
{ "_id" : ObjectId("5ca6a9269a6c64190bfbe409"), "threatlevel" : 3, "timestamp" : "1530667861", "devicename" : "def", "alertsource" : "pre" }
{ "_id" : ObjectId("5ca6a9269a6c64190bfbe40a"), "threatlevel" : 1, "timestamp" : "1531013461", "devicename" : "def", "alertsource" : "p1" }
{ "_id" : ObjectId("5ca6a9269a6c64190bfbe408"), "threatlevel" : 2, "timestamp" : "1531359061", "devicename" : "abc", "alertsource" : "wine" }
{ "_id" : ObjectId("5ca6a9259a6c64190bfbe3f5"), "threatlevel" : 2, "timestamp" : "1531704661", "devicename" : "def", "alertsource" : "wine" }
{ "_id" : ObjectId("5ca6a9279a6c64190bfbe425"), "threatlevel" : 4, "timestamp" : "1531877461", "devicename" : "bcd", "alertsource" : "av" }

У меня есть рабочий запрос в отношении агрегации, основанный на "уровне угрозы", который возвращает общее количество за вхождение "уровня угрозы".

{
    "collection": "threats",
    "$aggregate": [{"$group" : {"_id" : "$ThreatLevel", 
    "Total" : {"$sum" : 1}}},  
    {"$sort" : { "_id": 1 }}]
}

Чтобы объяснить лучше, это то, что я хотел бы закончить. Первый квартал будет между 9 и 12 месяцами назад, второй квартал - через 3-6 месяцев, третий квартал - 6-9 и четвертый квартал 3 по настоящее время.

ThreatLevel AlertSource Date    Qty
4                 p1    Q1  1
3                 p1    Q1  1
1                 p1    Q2  1
4                 av    Q1  2
2                 av    Q1  1
1                 av    Q2  1
2                 av    Q2  1
5                 av    Q2  2
4                 av    Q2  1
3                 pre   Q2  1
5                 wine  Q1  2
2                 wine  Q1  1
1                 wine  Q1  1
2                 wine  Q2  3
5                 wine  Q2  1

Любая помощь будет действительно присвоена!

...