Есть ли способ установить значения моих полей в динамике запроса MongoDB c? - PullRequest
0 голосов
/ 04 августа 2020

Я выполняю запрос MongoDB и пытаюсь изменить способ структурирования вывода. В настоящее время это выглядит следующим образом:

[
  {
    qClass: [
      {
        cat: 'Servers',
        class: 'High Impact Maintenance',
        total: 1
      },
      {
        cat: 'Network.TrafficShapers',
        class: 'Maintenance',
        total: 16
      },
      {
        cat: 'Network.Hop',
        class: 'Core Failure',
        total: 2
      },
      {
        cat: 'Office.MFD',
        class: 'Failure',
        total: 4
      },
      {
        cat: 'Office.Printers',
        class: 'Maintenance',
        total: 36
      },
      {
        cat: 'Office.MFD',
        class: 'Maintenance',
        total: 880
      },
      {
        cat: 'Network.TrafficShapers',
        class: 'Failure',
        total: 47
      },
      {
        cat: 'Servers',
        class: 'Core Maintenance',
        total: 1
      },
      {
        cat: 'Network.Switches',
        class: 'Failure',
        total: 5
      },
      {
        cat: 'Servers',
        class: 'Performance',
        total: 21
      },
      {
        cat: 'Network.Switches',
        class: 'High Impact Failure',
        total: 4
      },
      {
        cat: 'Network.Firewall',
        class: 'Core Failure',
        total: 2
      },
      {
        cat: 'Network.Router',
        class: 'Failure',
        total: 53
      },
      {
        cat: 'Servers',
        class: 'High Impact Failure',
        total: 3
      },
      {
        cat: 'Office.Printers',
        class: 'Performance',
        total: 1
      },
      {
        cat: 'Network.TrafficShapers',
        class: 'Performance',
        total: 3
      },
      {
        cat: 'Network.Switches',
        class: 'Maintenance',
        total: 1
      },
      {
        cat: 'Servers',
        class: 'Failure',
        total: 60
      },
      {
        cat: 'Network.Router',
        class: 'Performance',
        total: 67
      },
      {
        cat: 'Network.Router',
        class: 'High Impact Failure',
        total: 39
      },
      {
        cat: 'Office.MFD',
        class: 'Performance',
        total: 5
      },
      {
        cat: 'Network.TrafficShapers',
        class: 'High Impact Failure',
        total: 593
      },
      {
        cat: 'Network.Router',
        class: 'Maintenance',
        total: 78
      },
      {
        cat: 'Office.Printers',
        class: 'High Impact Failure',
        total: 2
      },
      {
        cat: 'Office.Printers',
        class: 'Failure',
        total: 1
      },
      {
        cat: 'Office.MFD',
        class: 'Critical Failure',
        total: 48
      }
    ]
  }
] 

И я надеялся, что он будет структурирован следующим образом:

{
    cat: 'Servers',
    High Impact Maintenance: 1,
    Performance: 24,
   Total: 25
} 

В общем, вся информация о cat (категории) в одном массиве и иметь имя поля Dynami c для класса. Ниже приведен запрос, который я использую для этого:

db.full_ticket_lists.aggregate(
  {
    
    $facet: {
            qClass: [
          {$match : {"device":{$ne:null},"status":"Open","ticket_class":{$ne:''}}},
          {$lookup: { from: "devices", localField: "device",  foreignField: "_id", as: "device_link"},},
          {$lookup: { from: "device_categories", localField: "device_link.device_category",  foreignField: "_id", as: "category_link"},},
          {$unwind: "$category_link"},
          {$group : {
                      _id:{"class_name":"$ticket_class", "cat_name":"$category_link.name"}, 
                      count: {$sum:1}
          },},
          {$project:{_id:0,cat:"$_id.cat_name", class:"$_id.class_name",total:"$count"}}
      ],
    }
  }
) 

1 Ответ

0 голосов
/ 05 августа 2020

Взгляните шаг за шагом, сосредотачиваясь на ожидаемом результате,

{
  "cat": 'Servers',
  "High Impact Maintenance": 1,
  "Performance": 24,
  "Total": 25
} 
  • $unwind qClass, потому что это массив, и нам нужен каждый объект ниже $ group part
  • $group by cat и
  • создать classes в pu sh class как ak (ключ) и total как av (значение)
  • create total to pu sh сумма всех total
db.collection.aggregate([
  {
    $unwind: "$qClass"
  },
  {
    $group: {
      _id: "$qClass.cat",
      cat: {
        $first: "$qClass.cat"
      },
      classes: {
        $push: {
          k: "$qClass.class",
          v: "$qClass.total"
        }
      },
      total: {
        $sum: "$qClass.total"
      }
    }
  },
  • $ replace Root заменит root новым массивом
  • $ mergeObjects объединит два объекта, первый $$ROOT и второй $classes, который преобразован в объект из массива
  • $ arrayToObject преобразует classes массив в объект, он преобразует k (ключ) и v (значение) в объект
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$$ROOT",
          {
            $arrayToObject: "$classes"
          }
        ]
      }
    }
  },
  • $project скроет ненужные поля ( 0 = скрыть, 1 = показать) поэтому здесь _id и classes скрыты, оба они больше не нужны
  {
    $project: {
      _id: 0,
      classes: 0
    }
  }
])

Игровая площадка: https://mongoplayground.net/p/vyGaHfXWJ0z

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...