Mon go DB - объединение двух групп полей в агрегаты - PullRequest
1 голос
/ 05 февраля 2020

У меня есть база данных объектов со структурой, похожей на следующую:

{
    "processID": value,
    "upstreamAppName": Name,
    "upstreamAppID": ID,
    "downstreamAppName": Name,
    "downstreamAppID": ID
}

Я хочу сгруппировать все приложения на основе имени и идентификатора, будь то восходящий или нисходящий. Я хочу выполнить sh, сгруппировав все уникальные комбинации { "$upstreamAppName", "$upstreamAppID" }, сгруппировав все уникальные комбинации { "$downstreamAppName", "$downstreamAppID" }, затем получить объединение этих двух наборов. Кто-нибудь скажет мне, какой запрос я могу использовать для выполнения sh этого?

1 Ответ

1 голос
/ 05 февраля 2020

Этого можно добиться с помощью $ facet & $ setUnion , попробуйте следующий запрос:

db.collection.aggregate([
    {
        $facet: {
            "upstream": [{ $group: { _id: { AppName: '$upstreamAppName', AppID: '$upstreamAppID' } } }, { $group: { _id: '', upstreamArr: { $push: '$$ROOT._id' } } }],
            "downstream": [{ $group: { _id: { AppName: '$downstreamAppName', AppID: '$downstreamAppID' } } }, { $group: { _id: '', downstreamArr: { $push: '$$ROOT._id' } } }]
        }
    }, { $unwind: '$upstream' }, { $unwind: '$downstream' }, { $project: { unionOfStreams: { $setUnion: ['$upstream.upstreamArr', '$downstream.downstreamArr'] } } }])

Тест: MongoDB-Playground

Примечание: Дополнительно вы можете добавить {$project : {_id :0, upstreamAppName:1,upstreamAppID:1 }}, & {$project : {_id :0, downstreamAppName:1,downstreamAppID:1 }} перед соответствующими этапами $group для оптимизированного запроса.

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