Запрос Spring / Java Mongo: Как добавить значения поля из нескольких документов в виде массива при группировке / проецировании - PullRequest
0 голосов
/ 25 марта 2019

Мои записи выглядят следующим образом:

 {
    domain: 'ABC',
    technology: 'Java',
    appName: 'app1',
    environment: 'Dev',
    version : '1_1',

    domain: 'ABC',
    technology: 'Java',
    appName: 'app1',
    environment: 'SQA',
    version : '1_1',

    domain: 'ABC',
    technology: 'Java',
    appName: 'app2',
    environment: 'Dev',
    version : '1_1',

    domain: 'DEF',
    technology: '.NET',
    appName: 'app3',
    environment: 'SQA',
    version: '1_3'

    }

Окончательный результат - получение списка среды и версии приложений, сгруппированных по доменам и технологиям (соотношение 1: 1 между этими двумя).Окружающая среда / Домен / Технология будет входом.если эта среда не существует, то я все еще хочу показать результат с версией N / A.

[
      {
      "domain": "ABC",
      "technology": "Java",
      "apps": [      
      {
         "appName": "app1",
         "environment": ["Dev","SQA"],
         "version": ["1_1", "1_1"],
         "hasVersionDiff": false
      }, 
      {
         "appName": "app2",
         "environment": ["Dev","SQA"],
         "version": ["1_1", "N/A"],
         "hasVersionDiff": true }]
      },
      {
      "domain": "DEF",
      "technology": ".NET",
      "apps": [      {
         "appName": "app3",
         "environment": ["Dev","SQA"],
         "version": ["N/A", "1_1"],
         "hasVersionDiff": true
      }
      ]
   }]

До сих пор я пробовал ниже:

Aggregation agg = Aggregation.newAggregation(
                    Aggregation.match(cr),

Aggregation.group("domain").first("technology").as("technology")
                    .addToSet(new BasicDBObject() {
                                  {
                                      put("technology", "$technology");
                                      put("domain", "$domain");
                                      put("environment","$environment");
                                      put("version", "$version");
                                      put("appName", "$appName");
                                  }
                              }
                    ).as("apps"));

Но этодает мне результат, как показано ниже, где для каждого приложения он показывает мне две записи diff для каждого env, также я не могу понять, как применить для них значение hasVersionDiff:

[

      {
      "domain": "ABC",
      "technology": "Java",
      "apps": [      {
         "appName": "app1",
         "environment": ["DEV"],
         "version": ["1_1"],
         "hasVersionDiff": false 
      },  {
         "appName": "app1",
         "environment": ["SQA"],
         "version": ["1_1"],
         "hasVersionDiff": false 
      } 
]
   }

и т.д ..

Мой класс модели выглядит следующим образом: CompareResult имеет домен, технологию и приложения ArrayList. Приложение имеет appName, список сред, список версий и логическое значение hasVersionDiff.

...