Сводный запрос Mongodb с использованием группировки - PullRequest
1 голос
/ 11 апреля 2020

В моем MongoDB хранятся документы, имеющие следующую структуру:

{
    "curl_detail" : {
        "Curl1" : {
            "attack_type" : "attack1",          
            "flag" : "Attack",
            "curl_result" : "Pass"
        },
        "Curl2" : {
            "attack_type" : "attack1",
            "flag" : "Attack",
            "curl_result" : "Pass"
        },
        "Curl3" : {
            "attack_type" : "attack2",
            "flag" : "Attack",
            "curl_result" : "Pass"
        },
        "Curl4" : {
            "attack_type" : "attack3",
            "flag" : "Attack",
            "curl_result" : "Fail"
        }
}
{
    "curl_detail" : {
        "Curl1" : {
            "attack_type" : "attack3",
            "flag" : "Attack",
            "curl_result" : "Pass"
        },
        "Curl2" : {
            "attack_type" : "attack2",
            "flag" : "Attack",
            "curl_result" : "Pass"
        },
        "Curl3" : {
            "attack_type" : "attack3",
            "flag" : "Pass",
            "curl_result" : "Pass"
        },
        "Curl4" : {
            "attack_type" : "attack1",
            "flag" : "Attack",
            "curl_result" : "Fail"
        }
}

Как выполнить агрегирование MongoDB для получения следующего вывода:

[{
    attack: "attack1",
    expected: 3,
    actual: 2
},
{
    attack:"attack2",
    expected: 2,
    actual: 2
},
{
    attack: "attack3",
    expected: 2,
    actual: 2
}]

Пояснение для требуемого вывода:

  1. Мне нужно сгруппировать по полю attack_type , соответствующему каждому локону, присутствующему в curl_detail .
  2. Теперь ожидается Поле в выходных данных является суммой ключа "flag" , имеющего значение "Attack" (Обратите внимание, что значения "Pass" не включается в сумму. См. ожидаемое значение attack3 в выходных данных для получения дополнительной информации)
  3. И фактическое поле на выходе представляет собой сумму ключа "curl_result" , имеющего значение "Pass" . (Обратите внимание, что «Fail» значения не включены в сумму)
  4. Сумма, рассчитанная для ожидаемое значение выходного сигнала зависит только от «флаг» ключ и сумма, вычисленная для фактического значение вывода зависит только от "curl_result" ключ.

1 Ответ

1 голос
/ 11 апреля 2020

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$addFields": {
    "curl_detail": {
      "$objectToArray": "$curl_detail"
    }
  }},
  { "$unwind": "$curl_detail" },
  { "$group": {
    "_id": "$curl_detail.v.attack_type",
    "expected": {
      "$sum": {
        "$cond": [
          { "$eq": ["$curl_detail.v.flag", "Attack"] },
          1,
          0
        ]
      }
    },
    "actual": {
      "$sum": {
        "$cond": [
          { "$eq": ["$curl_detail.v.curl_result", "Pass"] },
          1,
          0
        ]
      }
    }
  }},
  { "$addFields": { "attack": "$_id", "_id": "$$REMOVE" }}
])

MongoPlayground

...