Агрегация MongoDB - показывать значения из разных массивов в одном массиве - PullRequest
1 голос
/ 14 мая 2019

У меня есть данные этого типа

{ 
"_id" : 6444, 
"name" : [
    {
        "name" : "John", 
        "sourcesID" : [
            1, 
            2
        ]
    }, 
    {
        "name" : "Jack", 
        "sourcesID" : [
            3, 
            4 
        ]
    }       
    ],
"address" : [
    {
        "city" : "Chicago", 
        "sourcesID" : [
            3, 
            4 
        ]
    }, 
    {
        "city" : "Boston", 
        "sourcesID" : [
            5, 
            6
        ]
    }       
]       

}

Я хочу объединить данные, чтобы иметь возможность сопоставить определенный sourcesID и найти все типы информации, которые пришлииз этого источника.

Вот чего я хочу достичь

{"type" : "name", "sourceID" : 1}
{"type" : "name", "sourceID" : 2}
{"type" : "name", "sourceID" : 3}
{"type" : "name", "sourceID" : 4}
{"type" : "address", "sourceID" : 3}
{"type" : "address", "sourceID" : 4}
{"type" : "address", "sourceID" : 5}
{"type" : "address", "sourceID" : 6}

Спасибо за вашу помощь.

1 Ответ

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

Предполагая, что всегда есть поле sourceID, вы можете запустить $ objectToArray , чтобы преобразовать возможность динамического чтения ключей объекта, а затем трижды запустить $ unwind , чтобы получить один документ на sourceID:

db.collection.aggregate([
    {
        $project: {
            data: {
                $filter: {
                    input: { $objectToArray: "$$ROOT" },
                    cond: {
                        $ne: [ "$$this.k", "_id" ]
                    }
                }
            }
        }
    },
    { $unwind: "$data" },
    { $unwind: "$data.v" },
    { $unwind: "$data.v.sourcesID" },
    {
        $project: {
            _id: 0,
            type: "$data.k",
            sourceID: "$data.v.sourcesID"
        }
    }
])

Игровая площадка Монго

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...