使用mongoTemplate的投影阶段引用无效

时间:2018-07-06 13:32:33

标签: spring spring-data spring-data-mongodb

我运行了一个聚合管道,但是由于引用无效,它在项目阶段失败了。我试图在一个干净的项目中进行复制,但我做不到。在聚合期间,已完成对org.springframework.data.mongodb.core.aggregation.ProjectionOperation.ProjectionOperationBuilder.FieldProjection#renderFieldValue的调用。我的项目和清理项目之间的区别是上下文类型。在清理项目中,上下文的类型为org.springframework.data.mongodb.core.aggregation.AggregationOperationRenderer.NoOpAggregationOperationContext,但是类型为org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext

        private Object renderFieldValue(AggregationOperationContext context) {
            if (this.value != null && !Boolean.TRUE.equals(this.value)) {
                return Boolean.FALSE.equals(this.value) ? 0 : this.value;
            } else {
                return SystemVariable.isReferingToSystemVariable(this.field.getTarget()) ? this.field.getTarget() : context.getReference(this.field).getReferenceValue();
            }
        }

简化的聚合是:

    GroupOperation groupOperation = group("currency")
    .first("rawValue").as("rawValue");

    AggregationOperation addFieldsOperation = aggregationOperationContext -> {
        return BasicDBObject.parse("{ $addFields: {  \"value\": {$divide: [\"$rawValue\", 100]}} }");
    };

    ProjectionOperation projectionOperation = project("currency", "value");

    Aggregation aggregation = newAggregation(
            groupOperation,
            addFieldsOperation
            ,projectionOperation
    );
    AggregationResults<Map> x = mongoTemplate.aggregate(aggregation, "bug", Map.class);

,但以下情况除外:

java.lang.IllegalArgumentException: Invalid reference 'value'!
    at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:99)
    at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:71)
    at org.springframework.data.mongodb.core.aggregation.ProjectionOperation$ProjectionOperationBuilder$FieldProjection.renderFieldValue(ProjectionOperation.java:1379)
    at org.springframework.data.mongodb.core.aggregation.ProjectionOperation$ProjectionOperationBuilder$FieldProjection.toDBObject(ProjectionOperation.java:1366)
    at org.springframework.data.mongodb.core.aggregation.ProjectionOperation.toDBObject(ProjectionOperation.java:214)
    at org.springframework.data.mongodb.core.aggregation.AggregationOperationRenderer.toDBObject(AggregationOperationRenderer.java:56)
    at org.springframework.data.mongodb.core.aggregation.Aggregation.toDbObject(Aggregation.java:580)
    at org.springframework.data.mongodb.core.MongoTemplate$BatchAggregationLoader.prepareAggregationCommand(MongoTemplate.java:2590)
    at org.springframework.data.mongodb.core.MongoTemplate$BatchAggregationLoader.aggregate(MongoTemplate.java:2573)
    at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1558)
    at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1499)

0 个答案:

没有答案