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

MongoDB aggregate使用$filter时contactedNumberMessages返回null问题排查

问题原因

  1. 字段路径引用错误:你的文档中contactedNumberMessages是嵌套在messaging.messages下的三级字段,你直接写$contactedNumberMessages会默认查找根级的contactedNumberMessages字段,而你的文档根层级根本不存在该字段,所以返回null。
  2. 过滤条件写反:你的需求是保留direction为in的入站消息,但当前代码的筛选条件写的是匹配out的出站消息,和需求不符。
  3. 嵌套数组未正确遍历:messaging和messages本身都是数组类型,你直接在$project里写嵌套结构没法自动遍历数组内的元素,需要配合$map操作符逐层处理数组元素。

修正后的聚合查询

Messages.aggregate([
  {
    $match: {
      _id: mongoose.Types.ObjectId(id) // 如果入参id是字符串,需要先转成MongoDB ObjectId类型
    }
  },
  {
    $project: {
      messaging: {
        $map: {
          input: "$messaging",
          as: "msgItem",
          in: {
            ourNumber: "$$msgItem.ourNumber",
            messages: {
              $map: {
                input: "$$msgItem.messages",
                as: "contactMsg",
                in: {
                  contact: "$$contactMsg.contact",
                  contactedNumberMessages: {
                    $filter: {
                      input: "$$contactMsg.contactedNumberMessages",
                      as: "message",
                      cond: {
                        $eq: ["$$message.direction", "in"] // 修正为筛选入站消息
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

额外注意事项

如果你的messaging数组和messages数组始终只有1个元素,也可以先用$unwind打平数组后再做过滤,写法会更简洁。

内容的提问来源于stack exchange,提问作者Brini M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:15:04