使用MongoDB聚合框架分组后无法获取Region、Theatre字段值如何解决
问题分析与解决方案
问题原因
- 部分文档不存在
Enrichment嵌套字段,或是Enrichment.Region、Enrichment.Theatre字段为空、未定义 - 少部分场景下可能存在线上实际文档的字段名拼写、大小写和测试文档不一致的问题,可先做基础字段校验
方案1:过滤无Enrichment信息的文档(推荐,保证统计结果有效性)
在原聚合语句最前面新增$match阶段,提前过滤不符合要求的文档,修改后完整语句如下:
db.getCollection('collection2').aggregate([ // 新增过滤阶段,仅保留存在有效区域、战区字段的文档 { "$match": { "Enrichment.Region": {"$exists": true, "$ne": null}, "Enrichment.Theatre": {"$exists": true, "$ne": null} } }, { "$group":{ "_id": { "Region": "$Enrichment.Region", "Theatre": "$Enrichment.Theatre", "Customer": "$Project", "Test Type": "$Test_Type", "Test Sub-type": "$Type", "Method": "$Method", "Quarter": "$Quarter" }, "TC Passed": {"$sum": "$TC_Passed"}, "Defects": {"$sum":"$Defects"}, "TC Failed": {"$sum": "$TC_Failed"}, "TC Blocked": {"$sum": "$TC_Blocked"} } }, { "$project": { "Region": "$_id.Region", "Theatre": "$_id.Theatre", "Customer": "$_id.Customer", "Test Type": "$_id.Test Type", "Test Sub-type": "$_id.Test Sub-type", "Method": "$_id.Method", "Quarter": "$_id.Quarter", "Defects" : "$Defects", "TC Passed" : "$TC Passed", "TC Failed" : "$TC Failed", "TC Blocked" : "$TC Blocked", "_id":0 } } ])
方案2:保留所有文档,为空字段设置默认值
如果需要统计所有文档,哪怕没有区域、战区信息,可以在$group阶段用$ifNull设置默认值,仅需要修改_id中对应字段的取值逻辑即可:
"_id": { "Region": {"$ifNull": ["$Enrichment.Region", "未知区域"]}, "Theatre": {"$ifNull": ["$Enrichment.Theatre", "未知战区"]}, // 剩余分组字段保持原有逻辑不变 "Customer": "$Project", "Test Type": "$Test_Type", "Test Sub-type": "$Type", "Method": "$Method", "Quarter": "$Quarter" }
校验方法
如果修改后还是无法返回对应字段,可以先执行简单查询验证实际文档的字段情况:db.collection2.find({"Enrichment.Region": {"$exists": true}}).limit(10)
检查返回的文档中是否存在正确的Enrichment嵌套字段。
内容的提问来源于stack exchange,提问作者subhra_user
相关产品推荐
相关产品推荐

