MongoDB聚合查询优化:多companyID分组统计需求及问题
解决MongoDB多companyID分组统计问题
我来帮你调整这个聚合查询,让它支持传入多个companyID并返回每个ID对应的统计结果。先拆解一下原来查询的问题:最后那个$group: {_id: null, ...}把所有结果都合并成了一条总记录,所以才会返回_id: null;而且原来的匹配条件只针对单个companyID,改成$in就能支持多个值了。
方案1:统计每个companyID下的总注册记录数
如果你的需求是每个公司的总注册条数(不管testID是否重复),可以简化查询,直接按companyID分组求和:
db.getCollection('reg').aggregate([ { '$match': { 'companyID': {'$in': [11, 5]}, // 这里传入多个目标companyID 'created': { '$gte': 1556726597, '$lt': 1580572997 } } }, { '$group': { '_id': '$companyID', // 按companyID作为分组依据 'totalRegistrations': {'$sum': 1} // 统计该公司的总注册记录数 } } ])
返回结果示例:
{ "_id" : 11, "totalRegistrations" : 100.0 } { "_id" : 5, "totalRegistrations" : 75.0 }
方案2:统计每个companyID下的不同testID数量
如果你的需求和原查询逻辑一致,是统计每个公司下有多少个唯一的testID,就需要调整分组顺序:
db.getCollection('reg').aggregate([ { '$match': { 'companyID': {'$in': [11, 5]}, 'created': { '$gte': 1556726597, '$lt': 1580572997 } } }, { '$group': { '_id': {'companyID': '$companyID', 'testID': '$testID'} // 先按公司+testID分组,实现testID去重 } }, { '$group': { '_id': '$_id.companyID', // 再按companyID汇总 'uniqueTestIDCount': {'$sum': 1} // 统计该公司的唯一testID数量 } } ])
返回结果示例:
{ "_id" : 11, "uniqueTestIDCount" : 10.0 } { "_id" : 5, "uniqueTestIDCount" : 8.0 }
关键修改点说明
- 把
$match阶段的companyID: 11改成companyID: {$in: [xxx, yyy]},即可匹配多个公司ID - 移除了原查询最后一步
_id: null的全局分组,改成按companyID分组,确保每个公司单独返回一条统计结果 - 原查询中的
$project步骤可以省略,MongoDB在分组时可以直接引用集合原字段
内容的提问来源于stack exchange,提问作者Jamal Westfield
相关产品推荐
相关产品推荐

