Мне нужна помощь в получении агрегированных данных из mongodb - некоторые в массивах, а некоторые не в массивах - PullRequest
1 голос
/ 26 марта 2020

У меня есть набор записей, которые выглядят так:

    "_id" : ObjectId("bbbbbb1d9486c90479aaaaaa"),
    "record" : {
        "type" : "MX_GTI",
        "products" : [ 
            "DAM"
        ],
        "services" : [ 
            "MySQL", 
            "DB2", 
            "MSSQL"
        ],
        "agents" : [ 
            {
                "gatewayName" : "impDBFgw01",
                "agentId" : 10140,
                "hpsAvg" : 772,
                "hpsMax" : 42901,
                "services" : "mssql"
            }, 
            {
                "gatewayName" : "impDBFgw01",
                "agentId" : 10120,
                "hpsAvg" : 95,
                "hpsMax" : 21631,
                "services" : "mssql"
            }, 
            {
                "gatewayName" : "impDBFgw02",
                "agentId" : 10187,
                "hpsAvg" : 0,
                "hpsMax" : 0,
                "services" : "mssql"
            }, 
            {
                "gatewayName" : "impDBFgw03",
                "agentId" : 10213,
                "hpsAvg" : 0,
                "hpsMax" : 0,
                "services" : "db2"
            }
        ],
        "gateways" : {
            "impDBFgw01" : {
                "gatewayName" : "impDBFgw01",
                "avgHps" : 875,
                "maxHps" : 15474
            },
            "impDBFgw02" : {
                "gatewayName" : "impDBFgw02",
                "avgHps" : 0,
                "maxHps" : 0
            },
            "impDBFgw03" : {
                "gatewayName" : "impDBFgw03",
                "avgHps" : 2892,
                "maxHps" : 76009
            }
        },
        "debug" : false
    }
}

Мне нужна помощь с двумя запросами:

  1. Для всех записей с type MX_GTI и products включающие DAM, получить поля services, hpsAvg и hpsMax для каждого агента в массиве agents[] в виде строки в формате <services>/<hpsAvg>/<hpsMax>. Примечание. Службы могут быть массивом.
  2. Для тех же записей получить количество шлюзов (количество элементов в объекте gateways). Это не массив, и я не могу это изменить.

Спасибо. Любая помощь будет оценена.

1 Ответ

1 голос
/ 26 марта 2020

Проверьте, соответствует ли это решение вашим требованиям:

db.collection.aggregate([
  {
    $match: {
      "record.type": "MX_GTI",
      "record.products": "DAM"
    }
  },
  {
    $project: {
      num_gateway: {
        $size: {
          $objectToArray: "$record.gateways"
        }
      },
      agents: {
        $map: {
          input: "$record.agents",
          in: {
            $concat: [
              {
                $cond: [
                  {
                    $isArray: "$$this.services"
                  },
                  {
                    $reduce: {
                      input: "$$this.services",
                      initialValue: "",
                      in: {
                        $concat: [
                          "$$value",
                          "$$this",
                          ","
                        ]
                      }
                    }
                  },
                  "$$this.services"
                ]
              },
              "/",
              {
                $toString: "$$this.hpsAvg"
              },
              "/",
              {
                $toString: "$$this.hpsMax"
              }
            ]
          }
        }
      }
    }
  }
])

MongoPlayground

...