我运行了一个聚合管道,但是由于引用无效,它在项目阶段失败了。我试图在一个干净的项目中进行复制,但我做不到。在聚合期间,已完成对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)