Database

[{"_id":"1","type":"start","datetime":"2022-02-01T10:15Z","userId":"1"},{"_id":"2","type":"end","datetime":"2022-02-01T10:20Z","userId":"1"},{"_id":"3","type":"start","datetime":"2022-02-01T10:16Z","userId":"2"},{"_id":"4","type":"end","datetime":"2022-02-01T10:21Z","userId":"2"},{"_id":"5","type":"start","datetime":"2022-02-02T11:01Z","userId":"1"},{"_id":"6","type":"end","datetime":"2022-02-02T11:02Z","userId":"1"}]

Query

db.collection.aggregate([{/** match each start*/"$match":{"type":"start"}},{/** lookup ends for userId in collection*/"$lookup":{"from":"collection","localField":"userId","foreignField":"userId","let":{"isoDate":{"$dateFromString":{"dateString":"$datetime","format":"%Y-%m-%dT%H:%MZ"}}},"pipeline":[{"$match":{"type":"end","$expr":{"$gt":[{"$dateFromString":{"dateString":"$datetime","format":"%Y-%m-%dT%H:%MZ"}},"$$isoDate"]}}}],"as":"endArray"}},{/** output desired fields*/"$project":{"_id":0,"userId":1,"started_at":"$datetime","end_at":{/** assumes original collection was sorted*/"$first":"$endArray.datetime"}}}])

Result