MongoDB聚合嵌套$map操作如何展平结果获取所有字符串值
MongoDB聚合嵌套数组map操作问题解答
基础能力说明
MongoDB聚合管道完全支持对对象数组内的嵌套数组执行$map映射操作,当前出现的嵌套结构问题不属于能力限制,是写法逻辑导致返回了二维数组,$setUnion不会自动展开嵌套的数组元素。
问题原因
第二层$map遍历$comments数组时,每个迭代项返回的是内层$map处理saves得到的子数组,最终这一层$map的输出结果为二维数组(结构类似[ [值1,值2], [值3] ])。$setUnion接收到二维数组输入时,会将每个子数组视为独立的集合元素,与其他输入项中的字符串值合并,最终导致users字段同时包含数组、字符串两种类型的元素。
修正方案
使用$reduce替代嵌套$map,遍历comments时直接将所有saves数组拼接为一维数组,再传入$setUnion做去重合并,即可得到全是字符串值的一维用户数组。
修正后的addFields管道阶段代码:
{ 'users': { '$setUnion': [ // 提取所有评论的owner字段 { '$map': { 'input': '$comments', 'as': 'each', 'in': '$$each.owner' } }, // 提取所有评论下saves数组的所有元素,直接返回一维数组 { '$reduce': { 'input': '$comments', 'initialValue': [], 'in': { '$concatArrays': ['$$value', '$$this.saves'] } } }, '$savesOnComment' ] } }
基于给出的样例文档执行上述管道,users字段输出结果如下,无嵌套数组结构,且自动完成去重:
users: ['61152b692816b44ff246e07b']
内容的提问来源于stack exchange,提问作者abbyabby
相关产品推荐
相关产品推荐

