MongoDB嵌套文档中在聚合查询内统计唯一EndpointId数量
MongoDB聚合查询:在现有统计中同时计算唯一EndpointId总数
你现在已经有了能统计每个Endpoint下唯一标签数和传感器总数的聚合管道,想要在同一个查询里额外得到所有唯一EndpointId的总数量对吧?我来帮你调整一下这个聚合查询,不用额外跑单独的查询就能搞定。
先回顾你的需求和现有查询
你的目标是:
- 对每个唯一
EndpointId,统计:- 该Endpoint下唯一
Tags.Uid的总数(标签数量) - 每个唯一
Tags.Uid下唯一Sensors.Type的数量之和(传感器总数)
- 该Endpoint下唯一
- 同时,额外统计所有唯一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
相关产品推荐
相关产品推荐

