Агрегатная проекция MongoTemplate, получение исключения при отображении свойств массива - PullRequest
2 голосов
/ 17 июня 2020

У меня есть два объекта и два объекта проекции, как показано ниже,

Основные объекты

public class MainItem {
    private String name;
    private List<subItem> subItems;
}


public class subItem {
    private String id;
    private String groupId;
    private String displayName;
    private Status status;
}

Объекты проекции

public class MainItemLight {
    private String name;
    private List<subItemLight> subItemList;
}


public class subItemLight {
    private String id;
    private String name;
}

Я пытаюсь сопоставить объекты Main с объектами проекции и вернуть список объектов MainItemLight. Ниже мой код:

mongoTemplate.aggregate(
        newAggregation(project("name")
        .and("subItems").as("subItemList")
        .and("subItems.displayName").as("subItemList.name")
    ),
"MyCollection", MainItemLight.class).getMappedResults();

Когда я пытаюсь сопоставить subItems.displayName с subItemList.name, я получаю следующее исключение:

Command failed with error 40176 (Location40176): 'Invalid $project 
:: caused by :: specification contains two conflicting paths. 
Cannot specify both 'subItemList.name' and 'subItemList'

Есть идеи, как это исправить?

1 Ответ

1 голос
/ 17 июня 2020

Делать это нужно так:

db.collection.aggregate([
  {
    $project: {
      name: 1,
      subItemList: {
        $map: {
          input: "$subItems",
          as: "item",
          in: {
            id: "$$item.id",
            name: "$$item.displayName"
          }
        }
      }
    }
  }
])

MongoPlayground

MongoTemplate

Aggregation agg = newAggregation(project("name").and(
    VariableOperators.Map.itemsOf("subItems").as("item").andApply(
    doc -> new Document()
        .append("id", "$$item.id")
        .append("name", "$$this.displayName")
    )
).as("subItemList"));

Примечание: реализация $map не является дружественным в Spring Mon go, поэтому нам нужно реализовать его вручную.

Источник: SpringData mongoDB API для агрегации $ map

...