You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB嵌套文档中在聚合查询内统计唯一EndpointId数量

MongoDB聚合查询:在现有统计中同时计算唯一EndpointId总数

你现在已经有了能统计每个Endpoint下唯一标签数和传感器总数的聚合管道,想要在同一个查询里额外得到所有唯一EndpointId的总数量对吧?我来帮你调整一下这个聚合查询,不用额外跑单独的查询就能搞定。

先回顾你的需求和现有查询

你的目标是:

  • 对每个唯一EndpointId,统计:
    1. 该Endpoint下唯一Tags.Uid的总数(标签数量)
    2. 每个唯一Tags.Uid下唯一Sensors.Type的数量之和(传感器总数)
  • 同时,额外统计所有唯一EndpointId的总数量(示例数据里是2)

你现有的聚合查询是:

db.collection.aggregate([ 
  { "$unwind": "$Tags" }, 
  { "$unwind": "$Tags.Sensors" }, 
  { "$group": { 
      "_id": { 
        "EndpointId": "$EndpointId", 
        "Uid": "$Tags.Uid", 
        "Type": "$Tags.Sensors.Type" 
      }, 
    }}, 
  { "$group": { 
      "_id": { 
        "EndpointId": "$_id.EndpointId", 
        "Uid": "$_id.Uid", 
      }, 
      "count": { "$sum": 1 } 
    }}, 
  { "$group": { 
      "_id": "$_id.EndpointId", 
      "tagCount": { "$sum": 1 }, 
      "sensorCount": { "$sum": "$count" } 
    }} 
])

调整后的聚合查询

我们可以在最后再加一个$group阶段,把所有Endpoint的统计结果聚合起来,同时保留每个Endpoint的详细数据,并且计算唯一Endpoint的总数。这里用到$push来保存每个Endpoint的统计信息,用$sum来计算总数量:

db.collection.aggregate([ 
  { "$unwind": "$Tags" }, 
  { "$unwind": "$Tags.Sensors" }, 
  { "$group": { 
      "_id": { 
        "EndpointId": "$EndpointId", 
        "Uid": "$Tags.Uid", 
        "Type": "$Tags.Sensors.Type" 
      }, 
    }}, 
  { "$group": { 
      "_id": { 
        "EndpointId": "$_id.EndpointId", 
        "Uid": "$_id.Uid", 
      }, 
      "count": { "$sum": 1 } 
    }}, 
  { "$group": { 
      "_id": "$_id.EndpointId", 
      "tagCount": { "$sum": 1 }, 
      "sensorCount": { "$sum": "$count" } 
    }},
  // 新增的分组阶段:统计唯一Endpoint总数,同时保留每个Endpoint的详情
  { "$group": {
      "_id": null,
      "totalUniqueEndpoints": { "$sum": 1 },
      "endpointStats": { "$push": {
          "endpointId": "$_id",
          "tagCount": "$tagCount",
          "sensorCount": "$sensorCount"
        }}
    }}
])

结果说明

这个查询会返回一个结果文档,包含:

  • totalUniqueEndpoints:所有唯一EndpointId的总数量(示例里就是2)
  • endpointStats:一个数组,每个元素是对应Endpoint的详细统计数据,比如:
    {
      "_id": null,
      "totalUniqueEndpoints": 2,
      "endpointStats": [
        {
          "endpointId": "89799bcc-e86f-4c8a-b340-8b5ed53caf83",
          "tagCount": 4,
          "sensorCount": 16
        }
        // 如果有其他Endpoint,也会在这里列出
      ]
    }
    

为什么这样可行?

在倒数第二个$group阶段,我们已经把数据按EndpointId分组,得到了每个Endpoint的统计结果。最后一个$group阶段把这些结果再聚合到一起:

  • $sum:1 每处理一个Endpoint的统计文档,就加1,正好得到唯一Endpoint的总数
  • $push 把每个Endpoint的统计信息存入数组,这样你既能拿到总数量,也能保留每个Endpoint的详细数据

这样就不用额外执行单独的查询,一次聚合就能得到所有你需要的指标啦!

内容的提问来源于stack exchange,提问作者Mhmd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:22