【问题标题】:MongoDB count,min,max,avg for aggregate using field with List of objectsMongoDB count,min,max,avg 使用带有对象列表的字段进行聚合
【发布时间】:2021-10-13 10:16:58
【问题描述】:

我在使用 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:命令失败并出现错误 40323(Location40323):“管道阶段规范对象必须只包含一个字段。”在服务器 localhost:27017 上。完整的响应是 {"ok": 0.0, "errmsg": "A pipeline stage specification object must contain just one field.", "code": 40323, "codeName": "Location40323"}

【问题讨论】:

  • $project$unwind 是两个不同的阶段 - 您有语法错误。有关这些聚合阶段的正确用法,请参阅 MongoDB 手册文档。
  • 如何获得avgminmax?顺便说一句,我认为您正在使用$unwind$group 寻找类似于this example 的东西。
  • 您能否详细说明“每种连接类型的列表大小”?该组是correlatedNodes.type 并检索计数吗?那么 min、max 和 avg 是什么意思呢?
  • 通过 min、max 和 avg 我的意思是获取有关集合中所有记录中每种类型的最小列表大小的信息。平均值和最大值相同。

标签: mongodb statistics aggregate


【解决方案1】:

感谢大家的帮助。

可行的解决方案是:

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

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2021-07-15
  • 2015-11-27
相关资源
最近更新 更多