MongoDB 3.4.3合并WorkProfile技能数组:解决数组嵌套问题
解决MongoDB聚合中JobSkills嵌套数组的问题
嘿,我明白你的困扰了——你现在得到的JobSkills是嵌套数组,原因很简单:WorkProfile本身就是一个数组,当你直接取$ResumeDetails.WorkProfile.JobSkills.CommonSkills时,MongoDB会返回每个WorkProfile条目里的CommonSkills数组,最后就变成了「数组的数组」。
要把它转成一维数组,你可以用MongoDB 3.4支持的$reduce操作符,遍历WorkProfile数组,逐个合并每个条目里的CommonSkills和OtherSkills,再把所有结果拼到一个数组里。
修改后的聚合查询
db.ResumeParsedData.aggregate([ {$match: {'DocId': '51cb2f49-fcb9-46a0-9040-67e0f986be11'}}, {$project: { 'JobSkills': { $reduce: { input: '$ResumeDetails.WorkProfile', initialValue: [], in: { $concatArrays: [ '$$value', { $concatArrays: ['$$this.JobSkills.CommonSkills', '$$this.JobSkills.OtherSkills'] } ] } } }, 'AdditionalSkills': { $setUnion: [ '$ResumeDetails.AdditionalSkills.CommonSkills', '$ResumeDetails.AdditionalSkills.OtherSkills' ] } }} ]).pretty()
代码解释
$reduce遍历WorkProfile数组:input指定要遍历的数组(就是你的WorkProfile)initialValue设置初始累加器为空数组in里的逻辑:先把当前WorkProfile条目里的CommonSkills和OtherSkills合并成一个数组,再把这个数组和累加器$$value里的内容合并,逐步构建出一维的技能数组
AdditionalSkills的逻辑不用改,因为它本身就不是嵌套在数组里的,$setUnion可以直接合并去重。
预期输出
你会得到一维的JobSkills数组,类似这样:
{ "_id" : ObjectId("5ad5ab8aaf2808b739ba6ab2"), "JobSkills" : [ ObjectId("5ad5ab860b94c96c738e914a"), ObjectId("5ad5ab860b94c96c738e9146") ], "AdditionalSkills" : [ ObjectId("5ad5ab860b94c96c738e90e6"), ObjectId("5ad5ab860b94c96c738e9142"), ObjectId("5ad5ab860b94c96c738e9175"), ObjectId("5ad5ab860b94c96c738e919b"), ObjectId("5ad5ab860b94c96c738e91f0"), ObjectId("5ad5ab860b94c96c738e9211"), ObjectId("5ad5ab860b94c96c738e9241"), ObjectId("5ad5ab860b94c96c738e9293"), ObjectId("5ad5ab860b94c96c738e92c8") ] }
内容的提问来源于stack exchange,提问作者Anurag Sharma
相关产品推荐
相关产品推荐

