Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to use sum and condition in group using spring data mongodb aggregation

db.test.aggregate(
   [ {
       $group:
         {
           _id: "$id",
           "total":{$sum: 1},
           "live" : { $sum : {$cond : { if: { $eq: ["$status",A"]},then: 1, else: 0}}},
           "chat_hrs" :{ $avg: { $subtract: [ "$end_time", "$start_time" ] } }}}]).

Kindly help me to write springmvc coding to use mongodb aggregation for the above query.

like image 699
madhu Avatar asked Oct 18 '22 13:10

madhu


1 Answers

You can use the below aggregation pipeline.

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ArithmeticOperators.*;
import static org.springframework.data.mongodb.core.aggregation.ConditionalOperators.when;
import static org.springframework.data.mongodb.core.query.Criteria.where;

Aggregation aggregation = 
           newAggregation(
               project("id").
                  and(when(where("status").is("A")).then(1).otherwise(0)).as("status").
                  and(Subtract.valueOf("end_time").subtract("start_time")).as("diffTime"),
               group("$id").count().as("total").sum("status").as("live").avg("diffTime").as("chat_hrs"));

Generated Mongo Query:

[{
    "$project": {
        "id": 1,
        "status": {
            "$cond": {
                "if": {
                    "$eq": ["$status", "A"]
                },
                "then": 1,
                "else": 0
            }
        },
        "diffTime": {
            "$subtract": ["$end_time", "$start_time"]
        }
    }
}, {
    "$group": {
        "_id": "$id",
        "total": {
            "$sum": 1
        },
        "live": {
            "$sum": "$status"
        },
        "chat_hrs": {
            "$avg": "$diffTime"
        }
    }
}]
like image 66
s7vr Avatar answered Oct 24 '22 05:10

s7vr