MongoDB新手求助:如何从对象数组中单独提取指定字段
解决MongoDB从数组对象提取字段为独立数组的问题
嘿,我懂你想要的效果啦——把skills数组里所有的skillName和experienceInMonths分别提取成独立的数组,对吧?你之前用的$elemMatch确实不是干这个的,它的作用是匹配并返回数组中符合条件的第一个元素,所以只能拿到单个匹配的skill对象,达不到你要的结果。下面给你两种可行的解决方案:
方法一:用聚合管道(推荐,完美匹配你的需求)
聚合管道的$map操作符可以帮你遍历数组,提取每个元素的指定字段,生成新的数组。执行下面的命令:
db.userforms.aggregate([ // 第一步:匹配到目标文档 { $match: {"emailId": "nagendra@gmail.com"} }, // 第二步:投影出你需要的结构 { $project: { _id: 0, // 排除_id字段 skillName: { $map: { input: "$skills", // 遍历的目标数组 as: "skill", // 数组元素的别名 in: "$$skill.skillName" // 提取每个元素的skillName字段 } }, experienceInMonths: { $map: { input: "$skills", as: "skill", in: "$$skill.experienceInMonths" // 提取每个元素的experienceInMonths字段 } } }} ])
执行后会得到你想要的结果:
{ "skillName" : [ "sql", "java" ], "experienceInMonths" : [ 2, 3 ] }
方法二:基础投影(快速提取字段,但结构不是你要的)
如果你只是想快速提取所有skill的这两个字段,但接受嵌套结构,可以用这种基础投影(MongoDB 3.2+支持):
db.userforms.find( {"emailId": "nagendra@gmail.com"}, {"_id": 0, "skills.skillName": 1, "skills.experienceInMonths": 1} )
返回结果会是:
{ "skills" : [ { "skillName" : "sql" }, { "skillName" : "java" }, { "experienceInMonths" : 2 }, { "experienceInMonths" : 3 } ] }
不过这个结构和你想要的不太一样,所以还是推荐第一种聚合的方法。
简单总结下:$elemMatch是用来筛选数组元素的,而提取所有元素的字段并整合成数组,聚合管道的$map才是正确的选择~
内容的提问来源于stack exchange,提问作者dolly vaishnav
相关产品推荐
相关产品推荐

