Database

[{"Date":ISODate("2016-06-16T09:54:29.379Z"),"MessageType":"GPGGA","Location":{"type":"Point","coordinates":[11.20,48.83]},"NumberOfSatellites":9,"Quality":"Rtk","TimeSinceLastDgpsUpdate":"09:57:27.2000000","Username":"xyz"},{"Date":ISODate("2016-06-16T09:54:39.379Z"),"MessageType":"GPGGA","Location":{"type":"Point","coordinates":[11.25,48.84]},"NumberOfSatellites":9,"Quality":"Rtk","TimeSinceLastDgpsUpdate":"09:57:27.2000000","Username":"xyz"},{"Date":ISODate("2016-06-16T09:54:49.379Z"),"MessageType":"GPGGA","Location":{"type":"Point","coordinates":[11.26,48.86]},"NumberOfSatellites":9,"Quality":"Rtk","TimeSinceLastDgpsUpdate":"09:57:27.2000000","Username":"xyz"},{"Date":ISODate("2016-06-16T09:54:29.379Z"),"MessageType":"GPGGA","Location":{"type":"Point","coordinates":[11.20,48.83]},"NumberOfSatellites":9,"Quality":"Rtk","TimeSinceLastDgpsUpdate":"09:57:27.2000000","Username":"abc"},{"Date":ISODate("2016-06-16T09:54:59.379Z"),"MessageType":"GPGGA","Location":{"type":"Point","coordinates":[11.22,48.81]},"NumberOfSatellites":9,"Quality":"Rtk","TimeSinceLastDgpsUpdate":"09:57:27.2000000","Username":"abc"},]

Query

db.collection.aggregate([{$addFields:{DateParts:{$dateToParts:{date:"$Date"}}}},{$addFields:{Date_Hour:{$dateFromParts:{year:"$DateParts.year",month:"$DateParts.month",day:"$DateParts.day",hour:"$DateParts.hour"}}}},{$sort:{Username:1,Date:1}},{$group:{_id:{Username:"$Username",Date_Hour:"$Date_Hour"},Locations:{$push:"$Location"}}},{$addFields:{distance:{$map:{input:{$range:[0,{$size:"$Locations"}]},in:{$cond:{if:{$eq:["$$this",0]},then:null,else:[{$arrayElemAt:[{$arrayElemAt:["$Locations.coordinates",{$subtract:["$$this",1]}]},0]},{$arrayElemAt:[{$arrayElemAt:["$Locations.coordinates",{$subtract:["$$this",1]}]},1]},{$arrayElemAt:[{$arrayElemAt:["$Locations.coordinates","$$this"]},0]},{$arrayElemAt:[{$arrayElemAt:["$Locations.coordinates","$$this"]},1]}]}}}}}},{$set:{distance:{$map:{input:"$distance",in:{$let:{vars:{dlon:{$degreesToRadians:{$subtract:[{$arrayElemAt:["$$this",0]},{$arrayElemAt:["$$this",2]}]}},dlat:{$degreesToRadians:{$subtract:[{$arrayElemAt:["$$this",1]},{$arrayElemAt:["$$this",3]}]}},lat1:{$degreesToRadians:{$arrayElemAt:["$$this",1]}},lat2:{$degreesToRadians:{$arrayElemAt:["$$this",3]}}},in:{$add:[{$pow:[{$sin:{$divide:["$$dlat",2]}},2]},{$multiply:[{$pow:[{$sin:{$divide:["$$dlon",2]}},2]},{$cos:"$$lat1"},{$cos:"$$lat2"}]}]}}}}}}},{$set:{distance:{$map:{input:"$distance",in:{$multiply:[6372.8,1000,2,{$asin:{$sqrt:"$$this"}}]}}}}},{$set:{distance:{$sum:"$distance"}}},{$unset:"Locations"}])

Result