Puedo usar la suma dentro de la operación de inserción en una consola MongoDB. Sin embargo, no entiendo cómo puedo hacer lo mismo con MongoTemplate.
$group : { _id: "$some_id", my_field: { $push : {$sum: "$my_field" }} }El código que estoy usando para esto es algo como:
Aggregation aggregation = Aggregation.newAggregation( match(matchingCriteria), group("some_id") .count() .as("count") .push("my_field") .as("my_field") project("some_id", "count", "my_field")); AggregationResults<MyModel> result = mongoTemplate.aggregate(aggregation, "my_collection", MyModel.class);La cosa es que quiero la suma de my_field pero viene como una matriz de my_field aquí (ya que estoy usando directamente el empuje). Puedo lograr lo mismo usando la suma anterior dentro de la operación de inserción. Pero no puedo usar eso para MongoTemplate. Mi aplicación está en Spring Boot. También busqué en los documentos para estos métodos, pero no pude encontrar mucho.
Además, intenté usar directamente .sum() también en el campo (sin usar el empuje), pero eso no funciona para mí ya que my_field es un objeto interno, y no es un número sino una matriz de números después de la agrupación. Es por eso que necesito usar la combinación push y sum.
Cualquier ayuda con respecto a esto es apreciada. Gracias por adelantado.
Pude hacer que esto funcionara usando el siguiente código:
Aggregation aggregation = Aggregation.newAggregation( match(allTestMatchingCriteria), project("some_id") .and(AccumulatorOperators.Sum.sumOf("my_field")) .as("my_field_sum") group("some_id") .count() .as("count") .push("my_field_sum") .as("my_field_sum"), project("some_id", "count", "my_field_sum")); AggregationResults<MyModel> result = mongoTemplate.aggregate(aggregation, "my_collection", MyModel.class);Usé AccumulatorOperators.Sum en la etapa de proyección y sumé los campos internos y obtuve el resultado deseado. Luego pasé esto a la etapa de agrupación donde hice la agregación de conteo ya que también necesitaba esos datos y luego tuve que proyectar todos los datos generados para recopilarlos como salida.