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

如何在Ubuntu的mongosh中用MongoDB聚合管道关联单文档内嵌套数组?

单文档内数组关联的MongoDB聚合实现

需求描述

现有MongoDB集合survey中的文档结构如下:

{
    "_id": 1,
    "caseName": "testy",
    "pages": [
        {
            "elements": [
            {
                "name": "t1"
            },
            {
                "name": "t2"
            },
            {
                "name": "t3"
            }]
        },
        {
            "elements": [
            {
                "name": "t2"
            },
            {
                "name": "t4"
            },
            {
                "name": "t1"
            }]
        }
    ],
    "dictionary": [
    {
        "name": "t1",
        "description": "descr 1"
    },
    {
        "name": "t2",
        "description": "descr 2"
    },
    {
        "name": "t3",
        "description": "descr 3"
    },
    {
        "name": "t4",
        "description": "descr 4"
    }
    ]
}

需要通过mongosh的db.survey.aggregate()聚合管道,将其转换为以下结构(把dictionary中的描述信息关联到对应pages.elements中):

{
    "_id": 1,
    "caseName": "testy",
    "pages": [
        {
            "elements": [
            {
                "name": "t1",
                "description": "descr 1"
            },
            {
                "name": "t2",
                "description": "descr 2"
            },
            {
                "name": "t3",
                "description": "descr 3"
            }]
        },
        {
            "elements": [
            {
                "name": "t2",
                "description": "descr 2"
            },
            {
                "name": "t4",
                "description": "descr 4"
            },
            {
                "name": "t1",
                "description": "descr 1"
            }]
        }
    ]
}

解决方案

使用嵌套的$map结合$indexOfArray和$arrayElemAt实现单文档内的数组关联,具体聚合命令如下:

db.survey.aggregate([
  {
    $set: {
      pages: {
        $map: {
          input: "$pages",
          as: "page",
          in: {
            elements: {
              $map: {
                input: "$$page.elements",
                as: "elem",
                in: {
                  name: "$$elem.name",
                  description: {
                    $arrayElemAt: [
                      "$dictionary.description",
                      { $indexOfArray: ["$dictionary.name", "$$elem.name"] }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $unset: "dictionary"
  }
])

步骤说明

  • $set阶段:
    1. 外层$map遍历pages数组,逐个处理每个页面对象;
    2. 内层$map遍历当前页面的elements数组,对每个元素:
      • 保留原name字段;
      • 用$indexOfArray找到该元素name在dictionary.name数组中的索引位置;
      • 再用$arrayElemAt根据索引从dictionary.description数组中取出对应的描述文本,拼接成新的元素对象。
  • $unset阶段:移除文档中不再需要的dictionary字段,得到目标结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:23:16