有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

SpringData MongoDB组操作中的java嵌套字段引用。试图获取所有文档的cpu和内存总和(单位:gb)

我有以下mongodb文档:

{
"_id" : ObjectId("5f283e7d39187d9ab77e7ece"),
"resourceType" : "VM",
"resourceInstanceName" : "virtual_machine_1",
"properties" :

{ "name" : "CentOS-VM", "cpu" : 2, "memory_in_gb" : 2, }

},
{
"_id" : ObjectId("5f28jh58hjf9ab77e7ece"),
"resourceType" : "VM",
"resourceInstanceName" : "virtual_machine_2",
"properties" :

{ "name" : "CentOS-VM", "cpu" : 8, "memory_in_gb" : 8, }

}

我在MongoShell中使用了以下查询,效果很好

db.collection.aggregate({
$match:

{ "resourceType":"VM" }

}, {
$group: {
_id: '',
instance:

{ $sum: 1 }

,
cpu:

{ $sum: '$properties.cpu' }

,
memory_in_gb:

{ $sum: '$properties.memory_in_gb'}

}
})

结果是

{ "_id" : "", "instance" : 2.0, "cpu" : 10, "memory_in_gb" : 10 }

使用spring数据,我编写了以下代码以产生相同的结果,但最终出现异常:

MatchOperation matchOperation = Aggregation.match(Criteria.where(RESOURCE_TYPE).is("VM"));
UnwindOperation unwindOperation = Aggregation.unwind("properties");
GroupOperation groupOperation = Aggregation.group(ID);
GroupOperation instanceOperation = Aggregation.group().count().as("instance");
GroupOperation cpuOperation = Aggregation.group("properties").sum("properties.cpu").as("cpu");
GroupOperation memoryOperation = Aggregation.group("properties").sum("properties.memory_in_gb").as("memory_in_gb");
Aggregation aggregation = Aggregation.newAggregation(matchOperation,unwindOperation,groupOperation,
instanceOperation, cpuOperation, memoryOperation);
return mongoTemplate.aggregate(aggregation, COLLECTION_NAME, Map.class).getMappedResults();

以下是stackTrace:

[http-nio-9083-exec-2] ERROR c.s.c.c.v.service.ComputeService.getComputeSummary - Error in Cloud Account-summary :java.lang.IllegalArgumentException: Invalid reference 'properties'!
at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:114)
at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:77)
at org.springframework.data.mongodb.core.aggregation.AbstractAggregationExpression.unpack(AbstractAggregationExpression.java:74)

共 (0) 个答案