Как использовать ConditionalOperators вместе с VariableOperator в Spring Data MongoDb Aggregation - PullRequest
0 голосов
/ 21 сентября 2018

Я вынужден использовать структуру агрегации и проект операцию Spring Data MongoDb .

Что бы я хотелнужно создать массив объектов в результате операции проекта.

Учитывая этот промежуточный результат агрегации:

{
  "processes": [
    {
      "id": "101a",
      "ownership": {
        "master": {
          "id": "201a",
          "username": "carl93"
        },
        "assignees": [
          {
            "id": "201a",
            "username": "carl93"
          },
          {
            "id": "202a",
            "username": "susan"
          }
        ]
      }
    },
    {
      "id": "101b",
      "ownership": {
        "master": null,
        "assignees": [
          {
            "id": "201a",
            "username": "carl93"
          },
          {
            "id": "202a",
            "username": "susan"
          }
        ]
      }
    }
  ]
}

Я хочу получить следующее:

{
  "responsibleUsers": [
    {
      "id": "201a",
      "username": "carl93",
      "processId": "101a"
    },
    {
      "id": "201a",
      "username": "carl93",
      "processId": "101b"
    },
    {
      "id": "202a",
      "username": "susan",
      "processId": "101b"
    }
  ]
}

Таким образом, для каждого процесса, если у владельца есть главный пользователь, я должен получить имя пользователя и идентификатор пользователя из объекта master , в противном случае я должен получить их от пользователей, которые находятся в assignee array.

Сейчас я могу обрабатывать только случай, когда мастер не равен NULL, и я использую что-то вроде этого:

ProjectionOperation po = Aggregation.project().and(VariableOperators.mapItemsOf("order.processes").as("rt")
            .andApply(
                    aggregationOperationContext -> {
                        Document document = new Document();
                        document.append("id", "$$rt.master.id");
                        document.append("username", "$$rt.master.username");
                        document.append("processId", "$$rt.id");

                        return document;
                    }
            )).as("responsibleUsers");

Любое предложениедля операции "если еще"?Возможно, мне следует использовать вложенные VariableOperations и ConditionalOperations, но я не могу понять, как.

...