You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:39:36