Skip to content

Invalid path reference after lookup #5011

Open
@FriedGov

Description

@FriedGov

Hello. We recently upgraded from spring-boot-starter-parent 3.1.1 to 3.5.3 and suddenly encountered this issue.
person in this case is reference to a collection in our database.

Code:

    LookupOperation lookupOperation1 = Aggregation.lookup("person", "person.$id", "_id", "person");
    operations.add(lookupOperation1);

    Criteria criteria = new Criteria();

    criteria = criteria.andOperator(
            Criteria.where("type").is("normal"),
            Criteria.where("person.deleted").is(true)
    );

    MatchOperation matchOperation2 = Aggregation.match(criteria);
    operations.add(matchOperation2);

    GroupOperation groupOperation3 = Aggregation.group("_id").count().as("count");

    Aggregation aggregation = Aggregation.newAggregation(lookupOperation1, matchOperation2, groupOperation3);
    AggregationResults<DBObject> countResults = mongoTemplate.aggregate(aggregation, Address.class, DBObject.class);`

Result:
org.springframework.data.mapping.MappingException: Invalid path reference person.deleted; Associations can only be pointed to directly or via their id property

at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.getPath(QueryMapper.java:1274)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:1134)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:1111)
at org.springframework.data.mongodb.core.convert.QueryMapper.createPropertyField(QueryMapper.java:365)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:155)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedKeyword(QueryMapper.java:386)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:128)
at org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext.getMappedObject(TypeBasedAggregationOperationContext.java:82)
at org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext.getMappedObject(TypeBasedAggregationOperationContext.java:77)
at org.springframework.data.mongodb.core.aggregation.InheritingExposedFieldsAggregationOperationContext.getMappedObject(InheritingExposedFieldsAggregationOperationContext.java:50)
at org.springframework.data.mongodb.core.aggregation.MatchOperation.toDocument(MatchOperation.java:74)
at org.springframework.data.mongodb.core.aggregation.AggregationOperation.toPipelineStages(AggregationOperation.java:55)
at org.springframework.data.mongodb.core.aggregation.AggregationOperationRenderer.toDocument(AggregationOperationRenderer.java:56)
at org.springframework.data.mongodb.core.aggregation.AggregationPipeline.toDocuments(AggregationPipeline.java:86)
at org.springframework.data.mongodb.core.aggregation.Aggregation.toPipeline(Aggregation.java:756)
at org.springframework.data.mongodb.core.AggregationUtil.createPipeline(AggregationUtil.java:98)
at org.springframework.data.mongodb.core.MongoTemplate.doAggregate(MongoTemplate.java:2135)
at org.springframework.data.mongodb.core.MongoTemplate.doAggregate(MongoTemplate.java:2110)
at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:2104)
at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:2019)`

However when we change lookupOperation1 to Aggregation.lookup("person", "person.$id", "_id", "p"); and the criteria to criteria = criteria.andOperator( Criteria.where("type").is("normal"), Criteria.where("p.deleted").is(true) ); it works.

It seems to occur when you assign an existing name of a reference to a lookup result. I tried finding what causes this in the change log, but no luck.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions