如何在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阶段:
- 外层
$map遍历pages数组,逐个处理每个页面对象; - 内层
$map遍历当前页面的elements数组,对每个元素:- 保留原
name字段; - 用
$indexOfArray找到该元素name在dictionary.name数组中的索引位置; - 再用
$arrayElemAt根据索引从dictionary.description数组中取出对应的描述文本,拼接成新的元素对象。
- 保留原
- 外层
- $unset阶段:移除文档中不再需要的
dictionary字段,得到目标结构。
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

