MongoDB 使用带有对象列表的字段进行聚合的计数、最小值、最大值、平均值

MongoDB count,min,max,avg for aggregate using field with List of objects

我在使用 MongoDB 集合获取统计数据时遇到问题。

Collection

[
  {
    "_id": {"$oid": "616309f71b021c754992bfca"},
    "correlatedNodes": [
      {
        "type": "IS_ULTIMATELY_CONSOLIDATED_BY",
        "nodes": ["I07WOS4YJ0N7YRFE7309"]
      }
    ],
    "fromTaskId": 20,
    "nodeName": "5493000U0YGG4VEQOX65"
  },
  {
    "_id": {"$oid": "616309f71b021c754992bfcb"},
    "correlatedNodes": [
      {
        "type": "IS_DIRECTLY_CONSOLIDATED_BY",
        "nodes": ["529900P6OUCFPVWCFE19", "8945007IZBKFQUQLIP85"]
      },
      {
        "type": "IS_ULTIMATELY_CONSOLIDATED_BY",
        "nodes": ["529900P6OUCFPVWCFE19"]
      }
    ],
    "fromTaskId": 20,
    "nodeName": "89450012XZ2GPWGIGH37"
  },
  {
    "_id": {"$oid": "616309f71b021c754992bfcc"},
    "correlatedNodes": [
      {
        "type": "IS_ULTIMATELY_CONSOLIDATED_BY",
        "nodes": ["815600C9588783AB0210"]
      },
      {
        "type": "IS_DIRECTLY_CONSOLIDATED_BY",
        "nodes": ["815600C9588783AB0210"]
      }
    ],
    "fromTaskId": 20,
    "nodeName": "815600228127946DFF05"
  },
  {
    "_id": {"$oid": "616309f71b021c754992bfcd"},
    "correlatedNodes": [
      {
        "type": "IS_ULTIMATELY_CONSOLIDATED_BY",
        "nodes": ["549300LI58A0MHGHTZ98"]
      }
    ],
    "fromTaskId": 20,
    "nodeName": "549300NV4OCF16TAS048"
  }
]

我想获取相关节点字段的基本统计信息。

类似于:

{
  "IS_ULTIMATELY_CONSOLIDATED_BY": {
      "count": 567,
      "avg": 22,
      "min": 3,
      "max": 50
    }
}

我所说的计数是指对每种连接类型使用列表大小。

我试过这样的聚合查询:

db.node_correlations.aggregate([
    {
        $project: {"correlatedNodes":  "$correlatedNodes" },
        $unwind: "$correlatedNodes"
    }
]);

但我收到错误消息:

[2021-10-13 12:14:10] com.mongodb.MongoCommandException: Command failed with error 40323 (Location40323): 'A pipeline stage specification object must contain exactly one field.' on server localhost:27017. The full response is {"ok": 0.0, "errmsg": "A pipeline stage specification object must contain exactly one field.", "code": 40323, "codeName": "Location40323"}

谢谢大家的帮助。

可行的解决方案是:

db.node_correlations.aggregate([
  {
    "$unwind": "$correlatedNodes"
  },
  {
    "$group": {
      "_id": "$correlatedNodes.type",
      "count": {
        "$sum": {"$size": "$correlatedNodes.nodes"}
      },
      "avg": {
        "$avg": {"$size": "$correlatedNodes.nodes"}
      },
      "min": {
        "$min": {"$size": "$correlatedNodes.nodes"}
      },
      "max": {
        "$max": {"$size": "$correlatedNodes.nodes"}
      }
    }
  }
])