首页 > 解决方案 > 我需要帮助从 mongodb 获取聚合数据 - 有些在数组中,有些不在数组中

问题描述

我有一组如下所示的记录:

    "_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获取字段,并将数组中的每个代理作为格式中的字符串。注意 - 服务可能是一个数组。productsDAMserviceshpsAvghpsMaxagents[]<services>/<hpsAvg>/<hpsMax>
  2. 对于相同的记录,获取网关的数量(gateways对象中的元素数量)。它不是一个数组,我无法改变它。

谢谢你。任何帮助将不胜感激。

标签: mongodbaggregation-framework

解决方案


检查此解决方案是否满足您的要求:

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"
              }
            ]
          }
        }
      }
    }
  }
])

Mongo游乐场


推荐阅读