Database

db={"conversation":[{_id:"x",lang:"en",timestamp:""}],"processes":[{_id:"y",conversationId:"x",name:"",timestamp:"",messages:[{"direction":"out","text":"How can I help you?","timestamp":ISODate("2019-05-23T11:08:18.423Z"),"_id":3},{"direction":"out","text":"Hello","timestamp":ISODate("2019-05-23T11:08:17.423Z"),"_id":1},{"direction":"in","text":"Hi","timestamp":ISODate("2019-05-23T11:08:18.423Z"),"_id":2}],completed:"true"}]}

Query

db.conversation.aggregate([{$project:{_id:1,timestamp:"$timestamp",conversationId:"$_id"}},{"$lookup":{"from":"processes","localField":"conversationId","foreignField":"conversationId","as":"process"}},{$project:{_id:"$_id",timestamp:"$timestamp",processes:{$map:{input:"$process",as:"process",in:{_id:"$$process._id",name:"$$process.name",timestamp:"$$process.timestamp",lastInMessage:{$reduce:{input:"$$process.messages",initialValue:null,in:{$cond:[{$and:[{$eq:["$$this.direction","in"]},{$gt:["$$this.timestamp","$$value.timestamp"]}]},"$$this","$$value"]}}},lastOutMessage:{$reduce:{input:"$$process.messages",initialValue:null,in:{$cond:[{$and:[{$eq:["$$this.direction","out"]},{$gt:["$$this.timestamp","$$value.timestamp"]}]},"$$this","$$value"]}}}}}}}}])

Result