MongoDB:将字符串数组与二维技能数组合并关联
MongoDB数组配对转换解决方案
刚好做过类似的数组索引配对转换需求,用MongoDB的聚合框架就能轻松实现你的需求,直接上可行的查询语句:
db.collection.aggregate([ { $addFields: { skillsWithNames: { $map: { input: { $zip: { inputs: ["$names", "$skills"], useLongestLength: false } }, as: "pair", in: { name: { $arrayElemAt: ["$$pair", 0] }, skills: { $arrayElemAt: ["$$pair", 1] } } } } } } ])
关键步骤解释:
- $zip 操作符:核心作用是把
names和skills两个数组按索引一一配对,生成一个新的二维数组,每个元素都是[对应name, 对应skills数组]的组合。这里设置useLongestLength: false是为了只处理两个数组长度匹配的部分(如果两个数组长度不一致,超出的元素会被忽略,刚好符合你“索引一一对应”的要求)。 - $map 操作符:遍历$zip生成的配对数组,把每个
[name, skills]的对子转换成你需要的对象结构——用$$pair引用当前遍历的配对元素,再通过$arrayElemAt分别取出第一个元素(name)和第二个元素(skills数组),最终拼成{name: "...", skills: [...]}的对象。 - $addFields 阶段:把生成的
skillsWithNames字段添加到原文档中,如果你只想返回这个字段而不需要原文档的其他内容,可以追加一个$project阶段来筛选字段:
db.collection.aggregate([ { $addFields: { skillsWithNames: { $map: { input: { $zip: { inputs: ["$names", "$skills"], useLongestLength: false } }, as: "pair", in: { name: { $arrayElemAt: ["$$pair", 0] }, skills: { $arrayElemAt: ["$$pair", 1] } } } } } }, { $project: { skillsWithNames: 1, _id: 0 // 可选,如果你不需要返回默认的_id字段 } } ])
内容的提问来源于stack exchange,提问作者Erez Shlomo
相关产品推荐
相关产品推荐

