修改聚合函数以获得重新格式化的结果

Modifying the Aggregation Function to get a reformatted result

我在 mongodb

中有这样的数据集
[
  {
    "task_id": "as4d2rds5",
    "url": "https:example1.com",
    "organization": "Avengers",
    "val": "null"
  },
  {
    "task_id": "rfre43fed",
    "url": "https:example1.com",
    "organization": "Avengers",
    "val": "valid"
  },
  {
    "task_id": "uyje3dsxs",
    "url": "https:example2.com",
    "organization": "Metro",
    "val": "valid"
  },
  {
    "task_id": "ghs563vt6",
    "url": "https:example1.com",
    "organization": "Avengers",
    "val": "invalid"
  },
  {
    "task_id": "erf6egy64",
    "url": "https:example2.com",
    "organization": "Metro",
    "val": "null"
  }
]

我正在尝试创建一个 mongodb 聚合函数,以便它会产生类似

的结果
[
  {
    "Metro": {
      "invalid": 0,
      "null": 1,
      "valid": 1,
      "url": "https:example2.com"
    },
  },
  {
    "Avengers": {
      "invalid": 1,
      "null": 1,
      "valid": 1,
      "url": "https:example1.com"
    }
  }
]

我从 Whosebug 得到了很多帮助才能到达这里。

我需要重新格式化从聚合器接收到的数据,以便它产生上述结果。目前的聚合脚本是

db.collection.aggregate([  {"$group": {"_id": {"k": "$organization","v": "$val"},"cnt": {"$sum": 1},"url": {$first: "$url"}}},
  {"$project": {"_id": 0, "url": 1, "k": "$_id.k", "o": {"k": "$_id.v", "v": "$cnt"}}},
  {"$group": {"_id": "$k", "v": { "$push": "$o"}, "url": {"$first": "$url"}}},
  {"$addFields": {"v": {"$mergeObjects": [{"null": 0,"valid": 0,"invalid": 0},{"$arrayToObject": "$v"}]}}},
  {"$project": {"_id": 0, "url": 1, "new": [{"k": "$_id","v": "$v"}]}},
  {"$addFields": {"new": {"$mergeObjects": [{"$arrayToObject": "$new"},{"url": "$url"}]}}},
  {"$replaceRoot": {"newRoot": "$new"}} ])

您可以尝试此查询以避免多个 $group(作为权衡,您有三个 $filter,但我认为这仍然比多个 $group 好):

此查询按organization分组,然后使用$project输出存在多少个“valid”、“invalid”和“null”的大小。

编辑:您还可以添加一个额外的步骤$replaceRoot以获得与您想要的完全相同的输出。

db.collection.aggregate([
  {
    "$group": {
      "_id": "$organization",
      "val": {
        "$push": "$val"
      },
      "url": {
        "$first": "$url"
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "organization": [
        {
          "k": "$_id",
          "v": {
            "url": "$url",
            "invalid": {
              "$size": {
                "$filter": {
                  "input": "$val",
                  "cond": {
                    "$eq": [
                      "$$this",
                      "invalid"
                    ]
                  }
                }
              }
            },
            "valid": {
              "$size": {
                "$filter": {
                  "input": "$val",
                  "cond": {
                    "$eq": [
                      "$$this",
                      "valid"
                    ]
                  }
                }
              }
            },
            "null": {
              "$size": {
                "$filter": {
                  "input": "$val",
                  "cond": {
                    "$eq": [
                      "$$this",
                      "null"
                    ]
                  }
                }
              }
            }
          }
        }
      ]
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$arrayToObject": "$organization"
      }
    }
  }
])

示例here