Mongo aggregrate условный $ match, $ group и $ project - PullRequest
0 голосов
/ 30 ноября 2018

Моя коллекция имеет структуру документа, как показано ниже:

{ AppName: 'test',
AppEnv: 'Development'
AppTech:'Java'
AppVersion: '1_0',

AppName: 'test',
AppEnv: 'SQA'
AppTech:'Java'
AppVersion: '1_0',

AppName: 'test22',
AppEnv: 'Development'
AppTech:'Java'
AppVersion: '1_2',

AppName: 'test22',
AppEnv: 'SQA'
AppTech:'Java'
AppVersion: '1_1',

AppName: 'test22',
AppEnv: 'Production'
AppTech:'Java'
AppVersion: '1_0',

AppName: 'test2',
AppEnv: 'Development'
AppTech:'.NET'
AppVersion: '1_0'

}

Мне нужно получить AppVersion на основе предоставленного AppName / AppEnv / AppTech. Например:

AppVersion (с некоторым флагом) на основена AppEnv всех, чей AppTech является «Java».Результат может выглядеть следующим образом:

{
AppName: 'test', 
AppTech: 'Java',
VersionInfo: [AppEnv: {'Development','SQA'}, AppVersion: {'1_0','1_1'}],
hasVersionDiff: 'false',

AppName: 'test22', 
AppTech: 'Java',
VersionInfo: [AppEnv: {'Development','SQA','Production}, AppVersion: {'1_2','1_1','1_0'}],
hasVersionDiff: 'true'

}

Может кто-нибудь предложить мне, как мне начать писать запросы для этого?

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

вы можете использовать MongoTemplate.

предположите, что ваш класс такой:

public class OutPutClass {
    String appName;
    String appTech;
    VersionInfo versionInfo;

    public class VersionInfo{

        List<String> appEnvs;
        List<String> appVersions;
    }
}

и запрос mongoTemplate:

final Criteria criteria =
            Criteria.where("appTech").is("Java");
    Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.match(criteria),
            Aggregation.group("AppName")
                    .first("AppName")
                    .as("appName")
                    .first("AppTech")
                    .as("appTech")
                    .push("AppEnv").as("versionInfo.appEnvs")
                    .push("AppVersion").as("versionInfo.appVersions")
    );

mongoTemplate.aggregate(
                        aggregation,
                        DocumentClass.class,
                        OutputClass.class
                );
0 голосов
/ 30 ноября 2018

Вы можете попробовать это

let query = {AppTech: 'Java'};
let result = await Collection.aggregate([
{ $match: query },
{ $group: { 
    _id: '$AppName', 
    AppTech: {$first: '$AppTech' },
    AppEnv: {$push: '$AppEnv'},
     AppVersion: {$push: '$AppVersion'}} 
},
{
    $project: {
        AppName: '$_id',
        AppTech: '$AppTech',
        VersionInfo: { AppEnv: '$AppEnv', AppVersion: '$AppVersion' }
    }
}

])

Я изменяю формат вывода, потому что ожидаемый формат невозможен.И я не включил поле hasVersionDiff, вы можете просто добавить его позже.

 {
    AppName: 'test', 
    AppTech: 'Java',
    VersionInfo: {
        AppEnv: ['Development','SQA'], 
        AppVersion: ['1_0','1_1']
    },
},
{
    AppName: 'test22', 
    AppTech: 'Java',
    VersionInfo: {
        AppEnv: ['Development','SQA','Production'],
        AppVersion: ['1_2','1_1','1_0']
    }
}
...