Короче говоря, я построил конвейер агрегации со следующими операциями:
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 в качестве входных данных для конвейера.