MongoDB聚合查询:筛选数组中含指定值的目标对象
正确的MongoDB聚合管道写法:筛选包含指定号码的联系人对象
需求说明
从前置处理后的文档中,筛选出contactsOfAppUsers数组里包含指定号码9999933333的对象,最终生成包含id和phoneNumbers(对应原contactsArray)字段的对象数组,存入matchingObjects字段。
前置处理后的数据
{ id: 123, contactsOfAppUsers:[ { id:'abc', contactsArray: ['9999911111','9999922222'] }, { id:'efg', contactsArray: ['9999933333','9999944444'] }, { id:'hij', contactsArray: ['9999955555','9999933333'] } ] }
期望结果
{ id: 123, matchingObjects:[ { id:'efg', phoneNumbers: ['9999933333','9999944444'] }, { id:'hij', phoneNumbers: ['9999933333','9999955555'] } ] }
错误写法问题分析
你之前的聚合语句用$map直接返回$in的布尔值,只会得到一个布尔数组,无法保留原对象结构,不符合需求。
正确聚合管道写法
db.phNumbers.aggregate([ // 前置阶段 {// Previous stage}, { $addFields: { matchingObjects: { // 先筛选出包含目标号码的联系人对象 $map: { input: { $filter: { input: "$contactsOfAppUsers", as: "cc", cond: { $in: ["9999933333", "$$cc.contactsArray"] } } }, as: "matched", // 转换为期望的字段结构 in: { id: "$$matched.id", phoneNumbers: "$$matched.contactsArray" } } } } } ])
代码解释
- $filter:遍历
contactsOfAppUsers数组,只保留contactsArray中包含9999933333的元素 - $map:将筛选后的元素转换为需求的结构,把
contactsArray重命名为phoneNumbers,保留原id字段 - $addFields:将处理后的数组添加为文档的
matchingObjects字段
内容的提问来源于stack exchange,提问作者SpaceX
相关产品推荐
相关产品推荐

