如何在 MongoDB 中展开对象内的数组?

Ski*_*pm3 6 database mongodb nosql aggregation-framework

我有关于 MongoDB 的 unwind 操作符。

所以,我有这样的文件。

{
    "name": "abc",
    "report": {
        "_2019": {
            "May": {
                "_9": {
                    "DATA": [{
                            "image": "xyz.png",
                            "object": true
                        },
                        {
                            "image": "abc.png",
                            "object": true
                        }
                    ]
                },
                "_10": {
                    "DATA": [{
                            "image": "ejf.png",
                            "object": false
                        },
                        {
                            "image": "qwe.png",
                            "object": false
                        }
                    ]
                }
            },
            "June": {
                "_1": {
                    "DATA": [{
                        "image": "jsk.png",
                        "object": false
                    }]
                }
            }
        },
        "_2020": {
            "January": {
                "_30": {
                    "DATA": [{
                        "image": "hhg.png",
                        "object": false
                    }]
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并希望将输出格式化为这样的内容

[{
    "image": "xyz.png",
    "object": true
}, {
    "image": "abc.png",
    "object": true
}, {
    "image": "ejf.png",
    "object": false
}, {
    "image": "qwe.png",
    "object": false
}, {
    "image": "jsk.png",
    "object": false
}, {
    "image": "hhg.png",
    "object": false
}]
Run Code Online (Sandbox Code Playgroud)

我发现的第一件事是使用 unwind,但它只接受数组。第二个是在编程端使用 foreach。但我认为这并不有效。这可能吗?谢谢。

mic*_*ckl 3

这里的问题是像_2020orJanuary或 之类的键_30是动态生成的。要从DATA级别访问子文档,您需要使用$objectToArray$map从键值对中获取值。在每个步骤之后,您需要$unwind,然后在最后一步中,您可以运行$replaceRootDATA将文档从根级别提升:

db.col.aggregate([
    {
        $project: {
            data: {
                $map: {
                    input: { $objectToArray: "$report" },
                    in: "$$this.v"
                }
            }
        }
    },
    { $unwind: "$data" },
    {
        $project: {
            data: {
                $map: {
                    input: { $objectToArray: "$data" },
                    in: "$$this.v"
                }
            }
        }
    },
    { $unwind: "$data" },
    {
        $project: {
            data: {
                $map: {
                    input: { $objectToArray: "$data" },
                    in: "$$this.v"
                }
            }
        }
    },
    { $unwind: "$data" },
    { $unwind: "$data.DATA" },
    {
        $replaceRoot: {
            newRoot: "$data.DATA"
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

蒙戈游乐场