Spring Data MongoDB GroupOperation не может отобразить «_id» из аннотированного поля @Id в модели POJO во время конвейера агрегации - PullRequest
0 голосов
/ 20 июня 2019

Короче говоря, я построил конвейер агрегации со следующими операциями:

MatchOperation filterOp = match(MongoUtils.and(
        filters.values().toArray(new Criteria[filters.size()])));
GroupOperation groupOp = group(Fields.from(
        Fields.field(HEADING.getFieldName()),
        Fields.field("category.match", "category"),
        Fields.field("services.match", "services")))
        .first(Fields.UNDERSCORE_ID).as("originalId");
ProjectionOperation projectToSample = project()
        .andExpression("originalId").as(Fields.UNDERSCORE_ID);
// some other stuff, and a pageable
TypedAggregation<OutObject> agg = new TypedAggregation<>(
        OutObject.class,
        filterOp,
        groupOp,
        projectToSample,
        skip((long) pageable.getPageNumber() * pageable.getPageSize()),
        limit(pageable.getPageSize()));

По сути, я пытаюсь сопоставить записи OutObject в соответствии со списком критериев фильтра, объединить записи OutObject по уникальности из 3 полей, а затем спроецировать их обратно в исходные значения.

Эта агрегация представлена ​​как таковая в JSON (я не предоставил здесь никаких критериев фильтрации, поэтому $ match в основном пуст):

{
    "aggregate": "__collection__",
    "pipeline": [
        {
            "$match": {
                "$and": [
                ]
            }
        },
        {
            "$group": {
                "_id": {
                    "heading": "$heading",
                    "category.match": "$category",
                    "services.match": "$services"
                },
                "originalId": {
                    "$first": "$_id"
                }
            }
        },
        {
            "$project": {
                "_id": "$originalId"
            }
        },
        {
            "$skip": {
                "$numberLong": "0"
            }
        },
        {
            "$limit": {
                "$numberLong": "100"
            }
        }
    ]
}

Структура OutObject:

public class OutObject {
    @Id
    @JsonIgnore
    private String id = null;

// other fields
}

Запуск этой агрегации с MongoTemplate.aggregate(agg, OutObject.class) приводит к следующей ошибке:

org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property _id found on com.company.project.model.OutObject!

Насколько мне известно, аннотация @Id в OutObject должна гарантировать, что поле id отображается в / из Mongo _id. Так что меня немного смущает, что он отказывается сопоставить _id с OutObject. У кого-нибудь есть понимание, как решить эту проблему?

Edit: я обнаружил, что это было именно в GroupOperation, и что это все еще происходило, даже когда это была первая операция в конвейере. Похоже, что существует какая-то проблема с чтением @Id из OutObject в качестве входных данных для конвейера.

...