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

MongoDB数组关联查询:从Exports关联Service获取服务名称及报错解决

问题解决:MongoDB聚合lookup匹配数组外键获取服务名称

错误原因

你遇到的$in requires an array as a second argument, found: missing报错,源于两处关键错误:

  • let变量定义错误:你传递了Exports的$_id,但实际需要关联的是Exports文档里的filter.servicesIds数组;
  • $in参数顺序颠倒:应该判断Service的_id是否存在于Exports的servicesIds数组,且子pipeline中无法直接访问外部集合字段,必须通过let定义的变量引用。

正确聚合查询代码

db.getCollection("Exports").aggregate([
    // 先过滤目标公司的导出记录,减少数据处理量
    // 注意:你原代码里的companyId值写错了,应匹配Exports文档实际的companyId "7feb1812d8"
    {
        "$match": { "companyId": "7feb1812d8" }
    },
    {
        "$lookup": {
            "from": "Service",
            "let": { "serviceIds": "$filter.servicesIds" }, // 传递需要匹配的servicesIds数组
            "pipeline": [
                {
                    "$match": {
                        "$expr": {
                            "$in": ["$_id", "$$serviceIds"] // 判断当前Service的_id是否在外部的servicesIds数组中
                        }
                    }
                },
                // 可选:只保留需要的服务字段,比如名称
                {
                    "$project": {
                        "_id": 0,
                        "name": 1
                    }
                }
            ],
            "as": "services" // 匹配到的服务结果会存入该字段
        }
    },
    // 可选:精简Exports返回字段,按需保留
    {
        "$project": {
            "_id": 1,
            "companyId": 1,
            "services": 1
        }
    }
])

关键说明

  • $match阶段:优先过滤目标数据,提升聚合处理效率;
  • let字段:将外部Exports文档的filter.servicesIds赋值给变量serviceIds,供子pipeline调用;
  • 子pipeline的$match:通过$expr启用表达式匹配,用$in实现数组外键匹配逻辑;
  • 可选$project阶段:按需筛选返回字段,避免冗余数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:11:04