首页 > 解决方案 > 丰富 mongodb 查询中的嵌套数组项

问题描述

我有一个嵌套很深的 mongo 集合。它的文件看起来像

{        
    first: [
        {
            second: [
                {
                    name: "some name",
                    third: [
                        1, 2, 3
                    ]
                }
            ] 
        }
    ],
    // other fields
}

我想从集合中得到以下响应:

{        
    first: [
        {
            second: [
                {
                    name: "some name",
                    third: [{
                            id: 1,
                            name: "some name"
                        }, {
                            id: 2,
                            name: "some name"
                        }, {
                            id: 3,
                            name: "some name"
                        }]
                }
            ] 
        }
    ]
}

我尝试使用以下查询

db.getCollection("collection").aggregate
([     
    {
        "$addFields": { 
            "first.second.third.id": "$first.second.third.id",            
            "first.second.third.name": "$first.second.name"
        }
    }
])

但它没有效果。我怎样才能得到想要的结果?先感谢您!

标签: mongodb

解决方案


您需要使用聚合来展开嵌套数组或映射数组以获得结果:

输入集合:

[
  {
    first: [
      {
        second: [
          {
            name: "some name",
            third: [
              1,
              2,
              3
            ]
          }
        ]
      }
    ]
  }
]

聚合查询:

db.collection.aggregate([
  {
    $project: {
      first: {
        $map: {
          input: "$first",
          as: "item",
          in: {
            second: {
              $map: {
                input: "$$item.second",
                as: "item2",
                in: {
                  name: "$$item2.name",
                  third: {
                    $map: {
                      input: "$$item2.third",
                      as: "item3",
                      in: {
                        id: "$$item3",
                        name: "$$item2.name"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

给出结果/输出:

[
  {
    "first": [
      {
        "second": [
          {
            "name": "some name",
            "third": [
              {
                "id": 1,
                "name": "some name"
              },
              {
                "id": 2,
                "name": "some name"
              },
              {
                "id": 3,
                "name": "some name"
              }
            ]
          }
        ]
      }
    ]
  }
]

推荐阅读