Как раскрутить массив внутри объекта в MongoDB? - PullRequest
2 голосов
/ 09 мая 2019

У меня есть про MongoDB в операторе размотки.

Итак, у меня есть такой документ.

{
    "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
                    }]
                }
            }
        }
    }
}

И хотите отформатировать вывод для чего-то подобного

[{
    "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
}]

Первое, что я обнаружил, это использование unwind, но он принимает только массив. И второй использует foreach на стороне программирования. Но я думаю, что это не эффективно. Это возможно? Спасибо.

1 Ответ

1 голос
/ 09 мая 2019

Проблема в том, что такие ключи, как _2020 или January или _30, генерируются динамически. Чтобы получить доступ к вложенным документам с уровня DATA, вам нужно попасть туда, используя $ objectToArray и $ map для получения значений из пар ключ-значение. После каждого из этих шагов вам нужно $ unwind , а затем на последнем шаге вы можете запустить $ replaceRoot для перевода документов из DATA в корневой уровень:

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"
        }
    }
])

Детская площадка Монго

...