Database

[{"from":ISODate("2020-01-17T10:23:27.645Z"),"to":ISODate("2020-01-17T12:23:28.760Z"),"visits":[{"from":ISODate("2020-01-17T10:23:27.646Z"),"to":ISODate("2020-01-17T10:30:28.760Z"),"service":ObjectId("5e05f17d6b7f7920d4a62403")},{"from":ISODate("2020-01-17T10:30:29.760Z"),"to":ISODate("2020-01-17T12:23:28.760Z"),"service":ObjectId("5e05f17d6b7f7920d4a62404")}]}]

Query

db.collection.aggregate([{$addFields:{nextDay:ISODate("2020-01-18T00:00:00Z"),today:ISODate("2020-01-17T10:00:00Z"),currDate:ISODate("2020-01-17T12:00:00Z")}},{$match:{$expr:{$and:[{$lt:["$to","$nextDay"]},{$gt:["$from","$today"]}]}}},{$addFields:{interval:{$range:[0,{$add:[{$divide:[{$subtract:["$currDate","$today"]},{$multiply:[60,60,1000]}]},1]},1]}}},{$unwind:"$interval"},{$addFields:{date:{$add:["$today",{$multiply:["$interval",60,60,1000]}]},nextHour:{$add:["$today",{$multiply:[{$add:["$interval",1]},60,60,1000]}]}}},{$project:{_id:0,date:1,visits:{$reduce:{input:"$visits",initialValue:0,in:{$add:["$$value",{$cond:[{$or:[{$and:[{$gte:["$$this.from","$date"]},{$lte:["$$this.from","$nextHour"]}]},{$and:[{$lte:["$date","$$this.to"]},{$gte:["$date","$$this.from"]}]}]},1,0]}]}}}}},{$group:{_id:"$date",visits:{$sum:"$visits"}}},{$sort:{_id:1}}])

Result