MongoDB聚合统计时如何合并两种结构同名字段的同值数据
解决方法
不用改存量数据,在聚合管道里加一个统一取值的阶段再分组即可。
核心逻辑是用$type判断value的字段类型:如果是对象类型,就取嵌套的value.value当实际统计值;如果是字符串类型,直接取value本身,之后用这个统一后的值做分组键,就能把同值不同结构的数据归到同一组统计。
调整后的完整代码:
let data: any = await this.dataModel.aggregate( [ { $match: { field: new ObjectID(fieldID), }, }, // 统一提取实际统计值作为分组键 { $addFields: { group_key: { $cond: [ { $eq: [{ $type: "$value" }, "object"] }, "$value.value", "$value" ] } } }, { $group: { _id: "$group_key", total_for_value: { $sum: 1 }, }, }, // 不需要临时生成的分组键字段可以加这步移除 { $project: { group_key: 0 } } ] );
补充说明
- MongoDB 4.2以上版本可以把
$addFields换成$set,语义更直观,执行效果完全一致 - 如果存在脏数据比如嵌套结构里缺失
value属性,可以在条件判断里再加一层非空校验,避免分组时出现不必要的null分组 - 这个写法没有额外性能损耗,和原聚合的执行效率基本一致,不需要提前清洗历史数据
内容的提问来源于stack exchange,提问作者user19238266
相关产品推荐
相关产品推荐

