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

MongoDB聚合$unwind未按预期工作,仅返回单条记录

MongoDB $unwind仅返回数组最后一条记录的问题排查

我的MongoDB中存在如下数据:

{
  "_id": {
    "$oid": "67d6dba348ee77f62b1527d3"
  },
  "job_code": "ACC",
  "job_id": "73337",
  "partners": [
    {
      "type": "Employee",
      "user_id": "132152"
    },
    {
      "type": "Employee",
      "user_id": "130947"
    },
    {
      "type": "Employee",
      "user_id": "132059"
    },
    {
      "type": "Employee",
      "user_id": "131235"
    },
    {
      "type": "Employee",
      "user_id": "131973"
    },
    {
      "type": "Employee",
      "user_id": "65335"
    },
    {
      "type": "Employee",
      "user_id": "101032"
    },
    {
      "type": "Employee",
      "user_id": "36598"
    },
    {
      "type": "Employee",
      "user_id": "94676"
    },
    {
      "type": "Employee",
      "user_id": "124424"
    }
  ],
  "timestamp": {
    "$date": "2024-11-15T08:20:16.000Z"
  },
  "user_id": "132059"
}

但当我对partners字段使用$unwind时,结果仅返回数组最后一条记录(user_id为124424),而非预期的10条记录,求问题原因。

我使用的完整查询(依赖npm包@mongodb^6.4.0):

const res = await db
    .collection(targetCollection)
    .aggregate(
        [
            {
                $match: {
                    job_code: {
                        $regex: `(^${jobCode}_)(LG[0-9]+|TG[0-9]+|LV[0-9]+|TV[0-9]+|L[0-9]+|T[0-9]+[^T00])$`,
                    },
                },
            },
            {
                $lookup: {
                    from: "partners",
                    let: {
                        job_id: "$job_id",
                    },
                    pipeline: [
                        {
                            $match: {
                                $expr: {
                                    $and: [
                                        {
                                            $eq: ["$value.job_id", "$$job_id"],
                                        },
                                        {
                                            $eq: ["$value.type", "Employee"],
                                        },
                                        {
                                            $ne: ["$value.state", "deleted"],
                                        },
                                    ],
                                },
                            },
                        },
                        {
                            $project: {
                                _id: 0,
                                type: "$value.type",
                                user_id: "$value.user_id",
                            },
                        },
                    ],
                    as: "partners",
                },
            },
            {
                $unwind: "$partners",
            },
            {
                $merge: sesColName,
            },
        ],
        {
            allowDiskUse: true,
        }
    )
    .toArray();

问题原因

你的聚合查询中,$lookup阶段的as: "partners"覆盖了原文档中同名的partners字段。你原本期望对原文档里包含10条数据的partners数组执行$unwind,但实际上经过$lookup后,partners字段已经被替换成从partners集合查询出来的结果数组。如果该$lookup的查询结果仅返回1条数据,那么$unwind后自然只会得到1条记录。

解决方案

  1. 修改$lookup的as参数为其他名称,避免覆盖原字段,比如as: "related_partners",之后若需处理原partners数组可以继续使用原字段,处理查询结果则用新字段。
  2. 检查$lookup的查询条件是否符合预期,确认partners集合中是否存在多条匹配value.job_id = "73337"、value.type = "Employee"且value.state != "deleted"的记录,调整查询逻辑确保返回预期的多条数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:07:42